2014-12-02 48 views
1

我試圖更改保存事件的連接。以下是我迄今所做的:更改保存事件的連接

我做和事件的saving方法:

protected static function boot() 
{ 
    parent::boot(); 

    static::saving(function($model) 
    { 
     $model->connection = 'test'; 
     var_dump($model); 
     return $model; 
    }); 
} 

然後我做一個節約User

$user = new User(); 
$user->save(); 

當做到這一點,但它仍然使用默認connection而不是test -connection我已經設置。

我同時具有defaulttest連接在app/config/database.php配置,你可以看到如下:(OBS:該變化是prefix

// ... 
'connections' => array(

    'default' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'database', 
     'username' => 'username', 
     'password' => 'password', 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ), 

    'test' => array(
     'driver' => 'mysql', 
     'host'  => 'localhost', 
     'database' => 'database', 
     'username' => 'username', 
     'password' => 'password', 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => 'test_', 
    ), 

), 
// ... 

var_dump原來用下面,在這裏可以看到$model->connection已被更改。

object(User)[159] 
    ... 
    protected 'connection' => string 'default' (length=7) 
    ... 

但它劇照某些原因進入表users,而不是test_users

有沒有人有任何想法如何使這項工作?

+2

1.你的數據庫配置有'default'和'draft'而不是'default'和'test',但我猜這只是一個忘記編輯的事情。至於手頭的情況 - '$ connection'是'Model'類的受保護變量,所以不太可能使用'$ model-> connection ='xyz';'編輯它,但是您可能會發現調用' $ model-> setConnection('xyz');'會更正確地做你想做的事情。或者,也許我走了。 – alexrussell 2014-12-02 15:50:55

+0

@alexrussell,你說得對,關於配置,謝謝指出。但是使用'$ model-> setConnection('xyz');'也可以在'var_dump'中進行更改,但不會在實際的SQL中進行更改。 – 2014-12-02 16:06:30

+0

簡短的回答:你不能那樣做。您不能在已建好的'Query \ Builder'上交換連接,這就是這種情況。 – 2014-12-02 16:22:32

回答

0

我想通過重寫Eloquent的save-方法來達到這個目的。

public function save(array $options = array()) 
{ 
    // set draft connection 
    Config::set('database.default', 'test'); 

    // do the actual save 
    parent::save($options); 

    // change back to original connection 
    Config::set('database.default', 'default'); 
}