Laravel更改关系,如果不返回子句,则子句



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

$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是最低值并选择最小值的事实。

最新更新