【问题标题】:Laravel query builder result to nested collectionLaravel 查询生成器结果到嵌套集合
【发布时间】:2016-01-30 04:54:59
【问题描述】:

我有一个 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   |
+-----------+---------+---------------+------------+-------------+----------+ 

编辑: 目前我在存储库中使用 DB::select() 语句获取数据,并希望将其作为一个对象从控制器传递到视图。


编辑2:
如果这不容易实现,那么这一切的基础是: 我有这种定义关系的数据库情况(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:
帕特里克斯的回答成功了一半:

-> 嗯,我看了一下 MySQL Query,这很奇怪......
第一
它以正确的条件加载所有 A(E_id 和 wherePivot)
然后
它加载 (A_id) 中的所有 B
它加载 (B_id) 中的所有 C
它加载 (C_id) 中的所有 E
--> 当然,这会导致比第一个 wright 查询更多的记录...

【问题讨论】:

  • 您是否使用 Eloquent 来取回数据?您能否分享一下您是如何获取数据并将其传递给视图的。

标签: laravel


【解决方案1】:

如果您的 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 将确保您仅获取与具有给定 ID 的 E 相关的 A 记录(和相关对象)。

编辑

我花了一秒钟,但我明白你的编辑在说什么,以及你所说的一半工作是什么意思。您是正确的,急切加载将加载比预期更多的记录。为了让这个方法起作用,你还需要为急切加载的每个步骤添加条件,但这会变得非常混乱:

$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();

【讨论】:

  • @Andi 我已经更新了我的答案,虽然它比我想要的要复杂得多。
  • 嗯好吧,这看起来像是一种工作方式......但是没有更简单的方法来建立这个吗? (可能是完全不同的方式?)
  • 它不像我希望的那样干净,但它可以工作..非常感谢。
  • @Andi 您可以使用闭包(或定义的函数)对其进行一些清理。我已经更新了代码。
猜你喜欢
  • 1970-01-01
  • 2018-06-02
  • 2019-06-22
  • 2019-02-05
  • 2017-05-26
  • 1970-01-01
  • 2016-12-31
  • 2021-01-01
  • 1970-01-01
相关资源
最近更新 更多