如何获取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
,这些 Item
由 Process
中名为 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();
我有一些嵌套的一对多关系如下:
Enquiry
有很多 Item
Item
有很多 Component
Component
有很多 Process
假设我已经加载了 Enquiry
模型。现在,我想访问每个 Item
中每个 Component
的第一个 Process
,这些 Item
由 Process
中名为 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();