Php 如果未返回行,则LAVEL更改关系where子句
我的控制器中有以下查询Php 如果未返回行,则LAVEL更改关系where子句,php,eloquent,distinct,query-builder,Php,Eloquent,Distinct,Query Builder,我的控制器中有以下查询 $items = Item::with(['subitems' => function($query) { $query->where('language_id', '=', 1); }])->get(); 这可以正确地获取所有项,包括语言id为1的子项 不过,有两件事我想做 首先,我需要返回具有不同“ref_id”值的所有子项 其次,我希望优先选择语言id1,但如果不存在,请使用任何语言id 例如,我知道这段代码不起作用,但我要找的是:
$items = Item::with(['subitems' => function($query) {
$query->where('language_id', '=', 1);
}])->get();
这可以正确地获取所有项,包括语言id为1的子项
不过,有两件事我想做
- 首先,我需要返回具有不同“ref_id”值的所有子项
- 其次,我希望优先选择语言id
,但如果不存在,请使用任何语言id1
$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'=>函数($query){
$subItems=$query->where('language_id','=',1)
->其中('ref_id','is','distinct');
如果($subItems->count(),其中('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();
我们可以使用您首选的
语言id
是最低值这一事实,并选择最低值。您所说的“具有不同的'ref\u id'值”是什么意思?每个ref\u id
值返回一个子项?是的,这是正确的。因此,如果有多个子项具有相同的ref\u id,则使用第一个子项,而忽略其余子项。抱歉,通过我的问题回过头来看,不清楚第一个子项是什么?具有最低id
的子项?没关系。只返回第一个子项可以。如果我实际这样做,我会得到所有子项。然后我会将子项分成几个组,每个ref_id对应一个组。然后从每个组中,我会保留第一个语言id为1的子项。如果没有,我只会保留第一个子项,而不管语言id如何,并将其余的子项放入bin。最终,我会有一个子项列表。每个子项都有一个唯一的引用id,最好有一个语言id为1,但不是必需的。这有意义吗?我认为单次查询可能太复杂了。您总是希望语言id
为1
?还是这只是一个示例值?效果很好。感谢您的帮助这是一个模棱两可的问题。