在 Laravel 中跨多个数据库访问 BelongsToMany 关系
使用存储在不同数据库中的模型时,您可能会遇到 Laravel 的 ownToMany 关系问题当数据透视表与目标模型不在同一数据库中时。为了克服这个问题,需要显式指定数据透视表的数据库名称。
为此,请修改包含数据透视表的模型中的 ownToMany 关系,如下所示:
<code class="php">public function bs() { $database = $this->getConnection()->getDatabaseName(); return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id'); }</code>
这种方法可确保 Laravel 在数据库中查找与保存关系的模型相对应的数据透视表,从而解决问题。
但是,如果您的项目使用 SQLite 数据库并且您打算运行单元测试,则需要额外考虑是必要的。 SQLite 需要将目标数据库附加到测试连接以方便访问数据透视表。这可以通过以下代码来实现:
<code class="php">public function bs() { $database = $this->getConnection()->getDatabaseName(); if (is_file($database)) { $connection = app('B')->getConnection()->getName(); $name = $this->getConnection()->getName(); \Illuminate\Support\Facades\DB::connection($connection)->statement("ATTACH DATABASE '$database' AS $name"); $database = $name; } return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id'); }</code>
注意事务的使用非常重要。如果当前连接使用事务,则 ATTACH DATABASE 语句将失败。相反,如果相关连接使用事务,则结果数据将从当前连接中隐藏。
要在附加数据库后进行清理,您可以执行迁移回滚或截断表,同时保留其结构。
其他选项包括将附加数据库复制到临时文件并在测试后替换源或利用 SQLite 数据库文件易于访问的特性。
以上是如何在 Laravel 中跨多个数据库访问 BelongsToMany 关系?的详细内容。更多信息请关注PHP中文网其他相关文章!