• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
استفاده از 2 دیتابیس
#1
سلام
در فایل کانفیگ 2تا db تعریف کردم یکی اصلی و یکی دیگه کانکشن استرینگش به صورت داینامیک ساخته میشه.
رو ساختن کانکشن استرینگ و سویچ رو دیتابیس دوم تو اکتیو رکود مشکلی ندارم مسله وقتی که از کیوری بیلدر استفاده می کنم همون کانکشن استرینگ اولیه که تو فایل کانفیگ هست لود میشه !!!!!!!!!!

فایل کانفیگ
کد پی‌اچ‌پی:
'db'=>array(
            
'connectionString' => 'mysql:host=localhost;dbname=mydb1',
            
'emulatePrepare' => true,
            
'username' => 'root',
            
'password' => '',
            
'charset' => 'utf8',
            
'class' => 'CDbConnection',
        ),
        
'db2' => array(
            
'connectionString' => 'mysql:host=localhost;dbname=mydb2',
            
'username' => 'root',
            
'password' => '',
            
'charset' => 'utf8',
            
'tablePrefix' => '',
            
'autoConnect' => false,
            
'class' => 'CDbConnection',
        ), 


----------------
کد پی‌اچ‌پی:
public function getDbConnection()
    {
        if(
self::$db!==null)
            return 
self::$db;
        else
        {
            
$connectionString 'mysql:host=localhost;dbname='.Yii::app()->params['activeDb'];
            
self::$db=new CDbConnection($connectionStringself::$userself::$pass);
            
self::$db->charset 'utf8';
            if(
self::$db instanceof CDbConnection)
            {
                
self::$db->setActive(true);
                return 
self::$db;
            }
            else
                throw new 
CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
        }
    } 


extends کلاس های مدل هامم تغییر دادم.همونطور که گفتم با اکتیو رکورد مشکلی نیست اما خروجی زیر
کد پی‌اچ‌پی:
echo Yii::app()->db2->createCommand()->connection->connectionString
is
:
mysql:host=localhost;dbname=mydb2 
  پاسخ
تشکر شده توسط :
#2
دقیقا مشکل چیه ؟
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :
#3
(۱۳۹۳ دى ۲۷, ۰۴:۵۷ ب.ظ)Reza نوشته: دقیقا مشکل چیه ؟
عرض کردم دیگه،کانکشن استرینگ دیتابیس دوم تغییر نمی کنه!
حتی وقتی یک کامپوننت جدید می سازم و ست می کنم باز هم کانکشن بر می گرده به حالت اولش
کد پی‌اچ‌پی:
.
.
.
Yii::app()->setComponent('db2'$db2); 

باید کد بالا رو هر دفعه قبل از اجرا کیوری بیلدر ، ران کنم!
خواستم از Behavior استفاده کنم راستش هیچی ازش نفهمیدم چندجا رو دیدم اما واضح نبود یا خطا داشت.
  پاسخ
تشکر شده توسط :
#4
خب چرا باید تغییر کنه ؟؟؟

ببین دوست خوبم شما وقتی دو تا دیتابیس داری وقتی میخوای از کوئری بیلدر استفاده کنی برای دیتابیس پیشفرض از
کد پی‌اچ‌پی:
Yii::app()->db 

و برای دیتابیس دوم از
کد پی‌اچ‌پی:
Yii::app()->db2 
استفاده میکنی.

توی مدلهات (برای اکتیو رکورد یا هر چی ) توی فایل مدل هر تیبلت متد
کد پی‌اچ‌پی:
public static function model($className=__CLASS__)
{

    return 
parent::model($className);

رو تبدیل کن به
کد پی‌اچ‌پی:
public static function model($className=__CLASS__)
    {
        
self::$db Yii::app()->db2;
        return 
parent::model($className);
    } 
تا اون مدل از دیتابیس دوم استفاده کنه .
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط : AnsNet
#5
ببنید برای کدهایی شبیه به این منظورم هست
کد پی‌اچ‌پی:
$mCount Yii::app()->db2->createCommand()
                    ->
select('COUNT(DISTINCT num) as Ted')
                    ->
from('my_t')
                        ->
where($wh)
                    ->
queryAll(); 
اصل موضوع به این صورته که سایت تعدادی کاربر داره که هرکاربر 1دیتابیس مختص خودش رو داره با ورود به سایت باید دیتابیس خودش استفاده بشه.
برای کد ها هم از 2روش پرس و جو ها اجرا میشن یکی اکتیو رکورد و دیگری کدهایی مشابه بالا
در قسمت اکتیو رکورد هیچ مشکلی ندارم اما برای کدهای بالا مشکل سر جاشه

با استفاده از این می خوام مقدار db2 در فایل کانفیگ جایگزین بشه(منظورم این نیست که مقدار درون فایل کانفیگ تغییر کنه)
کد پی‌اچ‌پی:
$db2 Yii::createComponent(array(
                    
'class' => 'CDbConnection',
                    
'connectionString' => 'mysql:host='.Yii::app()->params['hostDb'].';port='.Yii::app()->params['portDb'].';dbname='.Yii::app()->params['activeDb'],
                    
'emulatePrepare' => true,
                    
'username' => Yii::app()->params['userDb'],
                    
'password' => Yii::app()->params['passDb'],
                    
'charset' => 'utf8',
                    
'enableProfiling' => true,
                    
'enableParamLogging' => true
                
));
        
            
Yii::app()->setComponent('db2'$db2); 
یک جایی دیدم از Behavior استفاده کرده بود منم یک کلاس نوشتم و فایل رو داخل component قرار دادم اما وقتی Behavior رو به مدل اضافه می کردم خطای تکراری بودن کلاس رو می گرفتم،جای فایل Behavior رو عوض کردم بردمش داخل extensions اما وقتی می خوام لودش کنم (داخل مدل) میگه فایل یا مسیر پیدا نشد.
کد پی‌اچ‌پی:
public function behaviors(){
        return array(
            
'switchDatabase'=>array('class'=>'application.extensions.switchDatabase')
            );
    } 

فایل Behavior :
کد پی‌اچ‌پی:
class SwitchDatabaseBehavior extends CBehavior
{
    public function 
attach($owner)
    {

        
$owner->attachEventHandler('onBeginRequest', array($this'myswitchDatabase'));

    }

    public function 
myswitchDatabase($event)
    {
        
$db2 Yii::createComponent(array(
                    
'class' => 'CDbConnection',
                    
'connectionString' => 'mysql:host='.Yii::app()->params['hostDb'].';port='.Yii::app()->params['portDb'].';dbname='.Yii::app()->params['activeDb'],
                    
'emulatePrepare' => true,
                    
'username' => Yii::app()->params['userDb'],
                    
'password' => Yii::app()->params['passDb'],
                    
'charset' => 'utf8',
                    
'enableProfiling' => true,
                    
'enableParamLogging' => true
                
));
        
            
Yii::app()->setComponent('db2'$db2);
    }

  پاسخ
تشکر شده توسط :
#6
نقل قول:اصل موضوع به این صورته که سایت تعدادی کاربر داره که هرکاربر 1دیتابیس مختص خودش رو داره با ورود به سایت باید دیتابیس خودش استفاده بشه.
برای کد ها هم از 2روش پرس و جو ها اجرا میشن یکی اکتیو رکورد و دیگری کدهایی مشابه بالا
در قسمت اکتیو رکورد هیچ مشکلی ندارم اما برای کدهای بالا مشکل سر جاشه
خب کاری که میکنید اشتباست Big Grin
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :
#7
(۱۳۹۳ دى ۲۸, ۱۲:۰۹ ق.ظ)Reza نوشته:
نقل قول:اصل موضوع به این صورته که سایت تعدادی کاربر داره که هرکاربر 1دیتابیس مختص خودش رو داره با ورود به سایت باید دیتابیس خودش استفاده بشه.
برای کد ها هم از 2روش پرس و جو ها اجرا میشن یکی اکتیو رکورد و دیگری کدهایی مشابه بالا
در قسمت اکتیو رکورد هیچ مشکلی ندارم اما برای کدهای بالا مشکل سر جاشه
خب کاری که میکنید اشتباست Big Grin

چرا؟؟؟
پیشنهاد شما؟
  پاسخ
تشکر شده توسط :
#8
خب یه فیلد دیگه اضافه کنید به تیبل هایتون به اسم user_id و همه دیتاها رو توی یه دیتابیس استفاده کنید.
اصلا روش مرسومی نیست کار شما .
بلفرض زمانی بخواید سایتتون رو منتقل کنید با ده هزار تا کاربر ، میتونید ده هزار تا دیتابیس بک آپ بگیرید و منتقل کنید؟
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :
#9
(۱۳۹۳ دى ۲۹, ۱۲:۳۲ ق.ظ)Reza نوشته: خب یه فیلد دیگه اضافه کنید به تیبل هایتون به اسم user_id و همه دیتاها رو توی یه دیتابیس استفاده کنید.
اصلا روش مرسومی نیست کار شما .
بلفرض زمانی بخواید سایتتون رو منتقل کنید با ده هزار تا کاربر ، میتونید ده هزار تا دیتابیس بک آپ بگیرید و منتقل کنید؟

برای کاری که می خواهیم استفاده کنیم باید هر کاربر دیتا جدا داشته باشه وگرنه راه حل شما ساده ترین راهه و از طرف دیگه چون اسکریپت کارایی خاصی داره تعداد کاربران آن هیچ وقت به 1000 نمیرسه(سایت نیس که هر نفر بیاد و عضو بشه که)
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان