我在Laravel应用中使用了单独的read
和write
个连接:
'mysql' => [
'write' => ['host' => env('DB_HOST_WRITE', 'localhost'),],
'read' => ['host' => env('DB_HOST_READ', 'localhost'),],
'driver' => 'mysql',
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'very'),
'username' => env('DB_USERNAME', 'secret'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
通常情况下,如果我想强制使用write
连接,我会写:
$user = User::onWriteConnection()->where('email', 'test@example.com')->first();
直接在模型上工作正常。但是如果我有一个案例需要在一个使用关系的特定方法中使用write
连接,如下所示:
$user = User::find(123);
$user->universities()->attach(array(34, 56, 2));
$user->universities()->dettach(array(4, 78));
$primary = $user->universities()->where('primary', 1)->first();
// and so on...
我希望所有基于关系的操作(无论它们实际上是读取还是写入)都要在write
连接上完成。
我如何在Laravel中这样做?
我尝试了什么:
(1)在关系上使用onWriteConnection()
方法 - 由于method是静态的并且直接连接到Eloquent Model对象,所以不起作用。
(2)使用setConnection()
方法:
$user = User::find(123);
$user->setConnection('mysql.write');
会抛出错误,即没有为连接指定driver
索引 - 这是有道理的,并证明这不是正确的方法。
答案 0 :(得分:5)
您可以直接使用查询构建器的useWritePdo()
方法,onWriteConnection()
在场景后面调用:
$primary = $user->universities()->useWritePdo()->where('primary', 1)->first();