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

How to get all first records (ordered by a column) of a nested one to many relationship in Laravel?

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

Enquiry 有很多 Item

Item 有很多 Component

Component 有很多 Process

假设我已经加载了 Enquiry 模型。现在,我想访问每个 Item 中每个 Component 的第一个 Process,这些 ItemProcess 中名为 order

的列排序

这张照片可能显示得更好(抱歉这样使用 ERD)

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

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

但它只给了我顶级进程,而不是属于给定 Enquiry.[=29= 的每个 Item 的每个 Component 的顶级 Process ]

如有任何帮助,我们将不胜感激。当然,任何有关更好标题的帮助也将不胜感激。谢谢。

你不能像这样在组件模型上定义关系吗:

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 Link 它指导我正确的方法。这就是我在 Laravel 中使用 QueryBuilder 处理子查询的方式。

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