如果不返回行,Laravel会更改关系where子句

时间:2018-04-27 14:35:34

标签: php eloquent distinct query-builder

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

1

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

虽然

我想做两件事
  • 首先,我需要返回所有具有明显< ref_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(); ,但如果不存在,请使用任何语言标识。

例如,我知道这段代码不会起作用,但我要找的是:

feature_geometry =
{
    'type': 'MultiPolygon',
    'coordinates': [[[
        [-120, 35],
        [-120.001, 35],
        [-120.001, 35.001],
        [-120, 35.001],
        [-120, 35]
    ]]]
}

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

1 个答案:

答案 0 :(得分: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是最低值并选择最小值的事实。