我在控制器中有以下查询。
$items = Item::with(['subitems' => function($query) {
$query->where('language_id', '=', 1);
}])->get();
这是正确的,包括我的所有项目,包括具有1个语言ID的子立场。
尽管我想对此做两件事
- 首先,我需要返回所有具有独特" ref_id"值的子项目。
- 其次,我想优先考虑语言ID
1
,但是如果没有语言,请使用任何语言ID。
所以,例如,我知道这个代码无法正常工作,但是我正在寻找的东西是:
$items = Item::with(['subitems' => function($query) {
$subItems = $query->where('language_id', '=', 1)
->where('ref_id', 'is', 'distinct');
if($subItems->count() <= 0) {
$subItems = $query->where('ref_id', 'is', 'distinct');
}
}])->get();
这是可能的,还是对于查询构建器而是太复杂了?即使两个请求之一是可能的,那也很棒。
尝试以下:
$items = Item::with(['subitems' => function($query) {
$join = Subitem::select('ref_id', DB::raw('MIN(language_id) language_id'))
->groupBy('ref_id');
$sql = '(' . $join->toSql() . ') subitems_distinct';
$query->join(DB::raw($sql), function($join) {
$join->on('subitems.ref_id', 'subitems_distinct.ref_id')
->on('subitems.language_id', 'subitems_distinct.language_id');
});
}])->get();
我们可以使用您首选的language_id
是最低值并选择最小值的事实。