Laravel 更改关系 where 子句 if not rows 被返回

Laravel change relationship where clause if not rows are returned

我的控制器中有以下查询。

$items = Item::with(['subitems' => function($query) {
    $query->where('language_id', '=', 1);
}])->get();

这正确地为我提供了所有项目,包括语言 ID 为 1 的子项目。

虽然我想用它做两件事

例如,我知道这段代码行不通,但我正在寻找的是:

$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 是最低值,select 是最小值。