如果模型C与任何与模型A相关的模型B相关,则检查

时间:2013-09-09 14:58:17

标签: php mysql laravel laravel-4 eloquent

我知道这似乎很复杂,但我会解释一下。

  • 我有3个型号,我们称之为A,B和C.
  • 所有这些都可以通过多对多关系与其他人建立联系。

我想检查,如果模型C与任何模型B相关,这与我的模型有关。

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

2 个答案:

答案 0 :(得分:0)

编辑:

经过一番挖掘并询问irc之后,事实证明我以前的方法根本不是处理这个问题的正确方法:)

感谢@Oddman和@Kindari对讨论的重要贡献 - 如建议的那样,为了测试两个“多对多模型”A和B是否相关,您可以使用list方法(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-tables

答案 1 :(得分:0)

如何使用几个内连接? Eloquent的优点在于,您可以始终使用Laravel's DB query builder作为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 ::启动查询并根据它进行调整。

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

并且不要忘记你可以create query scope出于此问题,因此在代码中的任何地方都可以轻松重复使用:)