Laravel 中跨多个数据库的 ownToMany 关系

2024-01-07

我有模型A和型号B位于两个不同的数据库中。

现在我有一个名为的数据透视表a_bs与模型位于同一数据库中A.

我在模型中设置了像这样的belongsToMany关系A

public function bs()
{
    return $this->belongsToMany('B', 'a_bs', 'a_id', 'b_id');
}

当我尝试像这样访问这种关系时:

$a = A::find($id);
print_r($a->bs->lists('id'));

我收到错误消息,模型 B 的数据库中不存在我的数据透视表。这显然是正确的,因为数据透视表位于模型 A 的数据库中。我怎样才能让 Laravel 知道这一点?

不建议将数据透视表放入模型 B 的数据库中


非常简单:

public function bs()
{
    $database = $this->getConnection()->getDatabaseName();
    return $this->belongsToMany('B', "$database.a_bs", 'a_id', 'b_id');
}

我正在动态获取数据库名称,因为我的连接是根据环境变量配置的。 Laravel 似乎假设数据透视表与目标关系存在于同一数据库中,因此这将迫使它查找与该方法所在模型(您的“A”领域)相对应的数据库。


如果您不担心 SQLite 数据库,即在单元测试范围内,那么这就是您所需要的。但如果你是,请继续阅读。


首先,前面的例子本身是不够的。 $database 的值最终将成为文件路径,因此您需要将其别名为不会破坏 SQL 语句的名称,并使其可供当前连接访问。"ATTACH DATABASE '$database' AS $name"你就是这样做的:

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');
}

警告:交易搞砸了:如果当前连接正在使用事务,则 ATTACH DATABASE 语句将失败。你can使用其上的交易after但执行该语句。

然而,如果related连接使用事务,生成的数据将默默地呈现为对当前数据不可见。这让我发疯的时间比我愿意承认的要长,因为我的查询运行没有错误,但总是空的。似乎只有真正写入附加数据库的数据才能真正被其附加数据库访问。

因此,在被迫写入附加数据库后,您可能仍然希望测试自行清理。一个简单的解决方案就是使用$this->artisan('migrate:rollback', ['--database' => $attachedConnectionName]);。但是,如果您有多个测试需要相同的表,则这不是很有效,因为它迫使它们每次都必须重建它们。

更好的选择是截断表,但保持其结构不变:

//Get all tables within the attached database
collect(DB::connection($database)->select("SELECT name FROM sqlite_master WHERE type = 'table'"))->each(function ($table) use ($name) {
        //Clear all entries for the table
        DB::connection($database)->delete("DELETE FROM '$table->name'");
        //Reset any auto-incremented index value
        DB::connection($database)->delete("DELETE FROM sqlite_sequence WHERE name = '$table->name'");
    });
}

这将擦除该连接中的所有数据,但是您没有理由不能对其应用某种您认为合适的过滤器。或者,您可以利用 SQLite DB 是易于访问的文件这一事实,只需将附件复制到临时文件,并在测试执行完成后使用它覆盖源代码。结果在功能上与交易相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 中跨多个数据库的 ownToMany 关系 的相关文章

  • 使用 MySQL:使用 Inner Join 更新字段的值

    我有一个主表和一个索引表 两个表共享一个称为 L Status 的公共主字段 我想根据索引表中名为 status 的引用将主表中的数据从 L Status 值 整数 更新为 L StatusLV 可读文本值 以下是我在 PHPmyAdmin
  • 替换字符串中带有变量的 preg_replace() 会占用第一个字符

    我正在尝试替换版本字符串 但它总是会吃掉版本字符串的第一个字母 直到我在中间放置一个空格 Version 1 new version 但我不想这样做 想了解这里发生的事情 文件内容 Version 4 4 4 我的代码的相关部分 new v
  • SQL 条件行插入

    如果满足条件是否可以插入新行 例如 我有这个表 没有主键也没有唯一性 image id tag id 39 8 8 39 5 11 如果 image id 和 tag id 的组合不存在 我想插入一行 例如 INSERT WHERE ima
  • 一键提交多个表单

    我在用 SESSION为我的网上商店动态创建表单 这些表单包含客户想要的产品的自定义信息 这是布局 Page1 客户填写的表格如下所示
  • 未找到 CakePHP DebugKit/插件 webroot

    我已经安装了 CakePHP 的调试工具包 但它无法在我的页面上正确加载 它只是页面底部的一堆文本和数组 我的浏览器显示出现 404 错误 debug kit css debug toolbar css debug kit js jquer
  • 无法使用 PDO 插入 MySQL 数据库...没有错误

    我遇到一个问题 无法使用 PDO 将任何内容插入 MySQL 数据库 我没有收到任何错误 但每当我检查数据库是否已插入行时 表都是空的 我知道我有一个到数据库的连接 因为我可以选择但不能插入 这是我扩展 PDO 的类 class Datab
  • php 大括号替换值[重复]

    这个问题在这里已经有答案了 我以前从未在 php 中使用过大括号 不过我正在更新现有的网站 在数据库中我有诸如此类的信息 YOUR NAME CH NAME URL NAME 我想检索信息并以适当的方式显示 我想将 CH NAME 变量影响
  • .php 随机图像在外部站点上作为 .jpg

    我发布的论坛只允许从外部 URL 加载 jpg png 和 gif 图像 我想解决这个问题 并从服务器上的目录中随机选择一个动态头像 但我无法使其正常工作 可能是由于在外部站点上执行了额外的检查 或者我的代码中存在错误 到目前为止 我已经在
  • 如何确定 Laravel 4.2 中模型是否使用软删除

    如何确定 Laravel 4 2 中模型是否使用软删除 In Laravel API http laravel com api class Illuminate Database Eloquent Model html 我找到了 isSof
  • mysql故障转移:如何选择slave作为新的master?

    我是 mysql 新手 当涉及到故障转移时 哪个从机应该晋升为新的主机 例如 A是master B和C是slave A对B和C进行异步复制 在某个时间点 B 从 A 接收的数据多于 C A 崩溃 如果我们将C提升为新的master 并将B的
  • Hibernate 乐观锁..它是如何工作的?

    我正在阅读下面关于休眠乐观锁定的博客 我打算将它与休眠一起使用 但是 我有一个担忧 我们有java代码和c 代码 都连接到一个数据库 虽然java代码可以使用hibernate来实现乐观锁定 但我想让c 代码做同样的事情 此外 C 代码正在
  • mysql select sql 中的竞争条件

    我试图完成的事情看起来很简单 数据库类型 MyISAM表结构 card id status查询 从表中选择一个未使用的card id 并将该行设置为 已使用 当两个查询同时运行并且状态更新之前 相同的card id被获取两次 这是否是竞争条
  • 连接多个表的查询执行速度慢

    我有以下表格 Parts id int idx partnumber varchar idx accountnumber idx enabled Sample data RefUserGroup id int idx value varch
  • 在cakephp 3中动态更改数据库连接

    我正在尝试更改中使用的数据库连接蛋糕php 3在飞行中 我找到的这个问题的每个答案都指的是蛋糕PHP 2 These https stackoverflow com questions 27655613 multiple databases
  • 检索MySQL中特定日期范围内发生的所有记录

    我有一个包含多个合同的表 每个合同都有一个开始日期和一个结束日期 如下所示 ID Contract Name Start Date End Date 1 Joe Bloggs 2012 01 01 2012 02 05 2 John Smi
  • 如何调试 MySQL 存储过程?

    我当前的调试存储过程的过程非常简单 我创建一个名为 debug 的表 在存储过程运行时从其中插入变量值 这允许我查看脚本中给定点的任何变量的值 但是有没有更好的方法来调试 MySQL 存储过程 下列debug msg可以调用过程来简单地将调
  • 创建 xml 文件

    我正在创建如下 xml 文件 有人可以帮助如何使用 php 获取该文件吗 xml 文件
  • phpMyAdmin 错误:mysqli_real_connect():(HY000/1045):用户'pma'@'localhost'访问被拒绝(使用密码:NO)

    我通过 XAMPP 连接 mysql 时不断收到以下错误 我不知道该怎么办 这是 config inc php 中的代码
  • 使用 Symfony 表单上传多个文件

    UPDATED在我的 Symfony 项目中 我能够上传单个图像 现在我正在尝试上传多个图像 class ImageFile extends AbstractType param FormBuilderInterface builder p
  • PHP 需要在不同的文件夹中

    好的 在我的网站上 我有一个脚本文件夹 其中包含一个连接到 mysql 服务器的 php 文件 所以如果我移动数据库 那么它将在连接到数据库的所有文件上更改它 我还有另一个名为 templates 的文件夹 在该文件夹中 顶部有页眉和页脚

随机推荐