在我的Laravel项目中,我使用了以下(
inspired from here)来获得从模型到另一个模型的远程关系.我不能使用
HasManyThrough方法,因为条和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(); }]); } }
这按预期工作,并返回与与MyClass对象相关的foos相关的条形相关的baz.我的问题是,我不知道如何使用它来轻松获取以下内容:
>每个巴兹所涉及的具体泡沫
>每个巴兹所涉及的foos总数
注意:返回的foos列表必须是baz与bar相关的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() }
The list of foos returned must be the foos that the bazs are related
to the bar through
如果你想通过特定的栏获得与baz相关的foos你只能通过嵌套的for / foreach循环访问,因为关系级别(bazs和它的条形图)都在集合中:
$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()方法一个简单的清单