Laravel查询构建器结果到嵌套集合

时间:2016-01-28 16:48:22

标签: laravel

我有一个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)中 - >但是,当然,这将导致比第一次怀疑查询更多的记录......

1 个答案:

答案 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();