在我的Laravel项目中,我使用了以下(inspired from here)来获得从模型到另一个模型的远程关系。我无法使用HasManyThrough方法,因为 bar 和 bazs 与多态关系相关。
public class MyClass
{
public function foos()
{
return $this->hasMany('App\Foo');
}
public function getBazAttribute()
{
$this->load(['foos.bars.bazs' => function ($q) use (&$bazs) {
$bazs = $q->get()->unique();
}]);
}
}
这可以按预期工作,并返回与条相关的 bazs ,这些条与 foos 相关strong> MyClass对象。我的问题是,我不知道如何使用它来轻松获取如下内容:
注意: foos 列表必须是 foos , bazs 与栏<相关< / strong>通过
答案 0 :(得分:0)
我会以一种方式回答这两个问题。
最简单的方法可能是加载foos
并加载 - 但以对立的方式 - 加载$bazs
集合:
$bazs->load('bars.foos');
并在baz的模型中定义了例如Accessor的方法:
public function getFoosAttribute()
{
$foos = \Illuminate\Database\Eloquent\Collection::make([]);
foreach ($this->bars as $bar) {
$foos->merge($bar->foos);
}
return $foos;
}
现在,当你把它们全部加载时你可以在那时进行迭代并使用一些foos集合的结果:
foreach ($bazs as $baz) {
// get all baz's foos way
$foosOfBaz = $baz->foos;
//when we have them all in collection we can easily count them
$foosOfBaz->count()
}
返回的foos列表必须是bazs相关的foos 到了酒吧
如果你想通过特定的栏获得与baz相关的foos你只能通过嵌套的for / foreach循环访问,因为两个关系级别(bazs和it&#39; s bars)都在集合中:
$bazs->load('bars.foos');
foreach ($bazs as $baz) {
foreach ($baz->bars as $bar) {
//here You can access the foos collection
//that is from bar's that belongs to baz model's object
$bar->foos;
}
}
注意:如果玩具想要获得数组,您必须使用:$bar->foos->toArray()
或使用->pluck('filed_name', 'key_name')->toArray()
方法获取简单列表
答案 1 :(得分:0)
您也可以使用外键来解决这种长关系问题。我在很多项目中经历过这么多次。让我解释一下:
解决问题的一种方法是。
Table A Table B Table C Table D 1 a x I 2 b y II 3 c z III
我们在这里说你有一个表A链接到表B,表B链接到表C,表C链接到表D.
如果要获取仅需要表A和D的数据,并且与中间表无关。您可以在D中创建直接连接到表A的外键关系。
以下是我的一个长期合作项目的例子。
在这里,如果您看到我是否需要计算给定用户的所有分数的总和,我需要将其放在排行榜中。我不想通过锦标赛获得分数。我可以通过向表中添加外键来直接计算。我不认为这是一个不好的做法。正如我通常通过保持前端模型在我脑海中创造这样的关系。这将使查询更容易。
我可能没有给出您需要的解决方案,但可以使用不同的方法来解决问题。但是想分享我通常用来解决这个问题的解决方案。