1

我知道这看起来很复杂,但我会解释一下。

  • 我有 3 个模型,我们称它们为 A、B 和 C。
  • 所有这些都可以通过多对多关系与其他人相关联。

我想检查模型 C 是否与任何模型 B 相关,而模型 B 与我的模型相关。

我想通过 Model C 的“名称”列而不是 ID 来检查它。

4

2 回答 2

0

只使用几个内部连接怎么样?Eloquent 的好处在于,您始终可以使用Laravel 的 DB 查询构建器作为 Eloquent 模型的一部分来处理更复杂的情况,因为 Eloquent 是基于查询构建器构建的。

    $a = A::select('a.id, a.name, b.id, b.name, c.id, b.name')
                    ->join('a_b_pivot', 'a.id', '=', 'b.a_id')
                    ->join('b_c_pivot', 'b.id', '=', 'c.b_id')
                    ->join('b', 'a_b_pivot.b_id', '=', 'b.id')
                    ->join('c', 'b_c_pivot.c_id', '=', 'c.id')
                    ->where('c.name', '=', $name);

可能不是最有效的方法,但应该比遍历模型并将所有内容加载为模型等更有效。

只要确保您提到所有带有表名的字段,否则它不起作用。根据您希望从查询中返回的模型,您还可以从 C:: 或 B:: 开始查询并据此调整它。

其他有用的事情可能是使用预先加载作为查询的一部分,或者在获得结果后使用 ->load('b,c) 。

并且不要忘记您可以从中创建查询范围,因此很容易在代码中的任何地方重用:)

于 2013-10-07T19:44:45.290 回答
0

编辑:

在 irc 上进行了一些挖掘和询问后,结果发现我以前的方法根本不是处理这个问题的正确方法:)

感谢@Oddman 和@Kindari 对讨论的大力投入 - 如建议的那样,要测试两个“多对多模型”A 和 B 是否相关,您可以使用列表方法 (Illuminate\Support\Collection)

in_array($b->id, $a->related()->lists('b_id'))

如果接下来您想通过“名称”检查 C 是否与 B 相关,您能否提供有关此列在关系中如何使用的详细信息 - 您是否将其显示在数据透视表中?如果是这样,也许您可​​以尝试以下方法-但这只是我在这里的疯狂猜测...

in_array($c->name, $b->related()->lists('c_name'))

除了上述之外,您始终可以使用适当的连接进行原始 sql 查询,这是使其正常工作的可靠方法。您可以从@NDM 建议的地方开始。

检查文档当然也是一件好事:http:
//four.laravel.com/docs/eloquent#many-to-many
http://four.laravel.com/docs/eloquent#working-with-pivot - 表

于 2013-09-09T15:14:23.070 回答