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 的子项目。
虽然我想用它做两件事
- 首先,我需要 return 所有具有不同 'ref_id' 值的子项。
- 其次,我想优先使用语言 ID
1
,但如果 none 存在,请使用任何语言 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
是最低值,select 是最小值。
我的控制器中有以下查询。
$items = Item::with(['subitems' => function($query) {
$query->where('language_id', '=', 1);
}])->get();
这正确地为我提供了所有项目,包括语言 ID 为 1 的子项目。
虽然我想用它做两件事
- 首先,我需要 return 所有具有不同 'ref_id' 值的子项。
- 其次,我想优先使用语言 ID
1
,但如果 none 存在,请使用任何语言 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
是最低值,select 是最小值。