如何在Laravel中获取嵌套的一对多关系的所有第一条记录(按列排序?)>

问题描述 投票:0回答:2

我有些嵌套的一对多关系如下:

[Enquiry hasMany Item] >>

[Item hasMany Component] >>

[Component hasMany Process] >>

想象一下我已经加载了Enquiry模型。现在,我想访问由Process中称为Component]的列排序的每个Item的每个Process的第一个order

This picture might show it better (Sorry for using ERD like this)

此图片可能显示得更好(对不起,使用ERD是这样的)

到目前为止,我得到的是这样的:

$enquiry->items->load(['components' => function($query) {
    $query->with(['processes' => function($query) {
        $query->orderBy('order')->limit(1)
    }]);
}])->get();

但是它只给我顶层处理,而不是属于给定Process的每个Component的每个Item的顶层Enquiry

任何帮助将不胜感激。当然,对于更好的标题的任何帮助也将不胜感激。谢谢。

我有一些嵌套的一对多关系,如下所示:查询hasMany项目Item hasMany组件Component hasMany Process想象我已经加载了查询模型。现在我想...

您是否不能像这样在Component模型上定义关系:

class Component {
    public function firstProcess() {
        return $this->hasMany(Process::class)->orderBy('order')->take(1);
    }
}

然后执行以下操作:

$enquiry->load('items.components.firstProcess');

然后您应该能够在每个组件上访问该属性:

foreach ($enquiry->items as $item) {
    foreach($item->components as $component) {
        print_r($component->firstProcess);
    }
}

我没有测试此代码。

感谢@PaulSpiegel,它将我定向到正确的方向。这就是我使用QueryBuilder在Laravel中使用子查询的方法。

$subQuery = DB::table('processes as icp')
            ->selectRaw('min(icp.order), icp.*')
            ->groupBy('icp.component_id');

$firstProcesses = DB::table('enquiries as enq')
            ->where('enq.id', $enquiry->id)
            ->join('items', 'items.enquiry_id', 'enq.id')
            ->join('components as ic', 'ic.item_id', 'items.id')
            ->joinSub($subQuery, 'icp', function ($join) {
                $join->on('ic.id', 'icp.component_id');
            })->get();
mysql laravel eloquent greatest-n-per-group
2个回答
1
投票

您是否不能像这样在Component模型上定义关系:

class Component {
    public function firstProcess() {
        return $this->hasMany(Process::class)->orderBy('order')->take(1);
    }
}

然后执行以下操作:


0
投票

感谢@PaulSpiegel,它将我定向到正确的方向。这就是我使用QueryBuilder在Laravel中使用子查询的方法。

$subQuery = DB::table('processes as icp')
            ->selectRaw('min(icp.order), icp.*')
            ->groupBy('icp.component_id');

$firstProcesses = DB::table('enquiries as enq')
            ->where('enq.id', $enquiry->id)
            ->join('items', 'items.enquiry_id', 'enq.id')
            ->join('components as ic', 'ic.item_id', 'items.id')
            ->joinSub($subQuery, 'icp', function ($join) {
                $join->on('ic.id', 'icp.component_id');
            })->get();
© www.soinside.com 2019 - 2024. All rights reserved.