【问题标题】:Laravel change relationship where clause if not rows are returnedLaravel 更改关系 where 子句如果不是行则返回
【发布时间】:2018-04-27 14:35:34
【问题描述】:

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

$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();

这可能吗,还是对于查询生成器来说有点太复杂了?即使这两个请求之一是可能的,那也很好。

【问题讨论】:

  • “具有不同的 'ref_id' 值”是什么意思?每个ref_id 值返回一个子项?
  • 是的,没错。因此,如果有多个具有相同 ref_id 的子项,则使用第一个,而忽略其余的。抱歉,回顾一下我的问题,不清楚
  • 第一个是什么? id最低的那个?
  • 没关系。只要返回的第一个就可以了。所以如果我在物理上这样做,我会得到所有的子项目。然后我会将 subItems 分成组,每个 ref_id 一组。然后从每个组中,我将保留语言 id 为 1 的第一个子项。如果没有,我将只保留第一个子项,而不管语言 id 和 bin 其余的。最终,我会有一个子项目列表。每个 subItem 将有一个唯一的 ref_id 并且最好有一个语言 id 1,但不是强制性的。那有意义吗?我认为单个查询可能太复杂了。
  • 您是否总是希望language_id 成为1?或者这只是一个示例值?

标签: php eloquent distinct query-builder


【解决方案1】:

试试这个:

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

【讨论】:

  • 效果很好。感谢您的帮助,尽管问题含糊不清。
猜你喜欢
  • 2020-12-15
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多