在Laravel关系上强制写入数据库连接

les*_*gar 3 php laravel laravel-5.4

我使用的是独立的read,并write连接在我Laravel应用程序:

'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,
        ],
Run Code Online (Sandbox Code Playgroud)

通常情况下,如果我想强制使用write连接,我会写:

$user = User::onWriteConnection()->where('email', 'test@example.com')->first();
Run Code Online (Sandbox Code Playgroud)

这很好,直接在模型上.但是,如果我有一个案例,我需要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...
Run Code Online (Sandbox Code Playgroud)

我希望所有这些基于关系的操作(无论它们是否实际上是读取或写入操作)都要在write连接上完成.

我怎么在Laravel做这个?

我尝试了什么:

(1)onWriteConnection()在关系上使用方法 - 由于方法是静态的并且直接连接到Eloquent Model对象,因此不起作用.

(2)使用setConnection()方法:

$user = User::find(123);
$user->setConnection('mysql.write');
Run Code Online (Sandbox Code Playgroud)

这会抛出driver没有为连接指定索引的错误- 这是有道理的,并证明它不是正确的方法.

the*_*len 6

您可以直接使用useWritePdo()查询构建器的方法,该方法onWriteConnection()在场景后面调用:

$primary = $user->universities()->useWritePdo()->where('primary', 1)->first();
Run Code Online (Sandbox Code Playgroud)