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
    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'=>函数($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
?还是这只是一个示例值?效果很好。感谢您的帮助这是一个模棱两可的问题。