我有一个Laravel,它是使用Laravel查询构建器构建的。我能够得到结果,但现在我想把它放在一个嵌套的集合中。我希望它在嵌套集合中,我可以在我的视图中使用这样的东西:
@foreach($lander AS $land)
// do something with $land
@foreach($land->companies as $company)
// do something with $company
@foreach($company->values as $value)
// do something with $value
@endforeach
@endforeach
@endforeach
这是我的查询结果,我想将其放入嵌套集合中:
+-----------+---------+---------------+------------+-------------+----------+
| 'land_id' | 'land' | 'company_id' | 'company' | 'value_id' | 'value' |
+-----------+---------+---------------+------------+-------------+----------+
| 1 | Germany | 1 | Company1 | 1 | value1 |
| 1 | Germany | 1 | Company1 | 2 | value2 |
| 1 | Germany | 2 | Company2 | 3 | value3 |
| 1 | Germany | 2 | Company2 | 4 | value4 |
| 1 | Germany | 3 | Company3 | 5 | value5 |
| 2 | France | 4 | Company4 | 7 | value6 |
| 2 | France | 4 | Company4 | 8 | value7 |
| 2 | France | 5 | Company5 | 9 | value8 |
+-----------+---------+---------------+------------+-------------+----------+
编辑: 目前我在Repository中使用DB :: select()语句获取数据,并希望将其作为一个对象从控制器传递给视图。
编辑2:
如果这不容易,那么基础就是:
我有这种DB情况与定义的关系(A,B,C,D,E是表):
A -> hasMany(B)
B -> hasMany(C)
C -> belongsToMany(E) -> through Pivot Table (D)
现在我来自一个 E 对象,想要一个我可以这样使用的集合:
@foreach($A as $a)
// do something with $a
@foreach($a->B as $b)
// do something with $b
@foreach($b->C as $c)
// do something with $c
@endforeach
@endforeach
@endforeach
编辑3:
patricus的答案是半工作:
- >嗯,我看了一下MySQL查询,这很奇怪......
的第一
它加载具有正确条件的所有A(E_id和wherePivot)
但是
它加载(A_id)中的所有B
它将所有C加载到(B_id)中
它将所有E加载到(C_id)中
- >但是,当然,这将导致比第一次怀疑查询更多的记录......
答案 0 :(得分:2)
如果您正确设置了Eloquent模型和关系,则可以执行以下操作:
// question states you have E; code assumes E is $myE
$eId = $myE->id;
$myA = A::with('B.C.E')->whereHas('B.C.E', function($query) use ($eId) {
$query->where('id', $eId);
});
// now you can loop through $myA, as you've described in your question.
with()
急切加载所有相关对象,而whereHas
将确保您只获取与E相关的A记录(和相关对象)给了id。
我花了一秒钟,但我意识到你的编辑在说什么,你的意思是半工作。你是正确的,渴望加载将加载比预期更多的记录。为了使这个方法起作用,你还需要为热切加载的每一步添加条件,但这会变得非常混乱:
$eId = $myE->id;
$fn = function($q) use ($eId) {
$q->where('id', $eId);
};
$myA = A::with([
// restrict each eager load level individually
'B' => function($q) use ($fn) {
$q->whereHas('C.E', $fn);
},
'B.C' => function($q) use ($fn) {
$q->whereHas('E', $fn);
},
'B.C.E' => $fn,
])
// restrict the A query
->whereHas('B.C.E', $fn)
->get();