如何通过动态值数组获取记录顺序?
How to get Records order by dynamic array of values?
我需要获取记录,以便 ID 数组位于集合的顶部。
$ids = [15, 20];
我试过了:
$list = $list->orderByRaw("field(id,".implode(',',$id).")");
但这只适用于 whereIn :
$list = $list->whereIn('id',$ids)->orderByRaw("field(id,".implode(',',$id).")");
但我需要获取除顶部 ID 15 和 20 之外的所有记录。如何实现。
您最好在 PHP 中手动完成此任务,而不是在 MySQL 中。
$keyed_list = $list->keyBy('id');
$ordered_list = collect();
foreach ($ids as $id) {
$ordered_list[] = $keyed_list[$id];
}
//Add the rest of items
$ordered_list = $ordered_list->merge($keyed_list->except($ids));
检查这个答案
$list->sortBy(function($model) use ($ids){
return array_search($model->getKey(), $ids);
}
这里需要使用MySQL派生的table和union
注意:当您使用 union with order by then 时,您必须设置一个限制,否则它将不起作用。
$ids = [15, 20];
DB::table(function($query) use ($ids) {
$query->from('users')
->whereIn('id',$ids)
->orderByRaw("field(id,".implode(',',$ids).")")
->limit(count($ids))
->union(DB::table('users')->whereNotIn('id',$ids));
},'users1')
您的查询:
select * from (
(select * from `users` where `id` in (?, ?) order by field(id,15,20) limit 2)
union
(select * from `users` where `id` not in (?, ?))
) as `users1`
我需要获取记录,以便 ID 数组位于集合的顶部。
$ids = [15, 20];
我试过了:
$list = $list->orderByRaw("field(id,".implode(',',$id).")");
但这只适用于 whereIn :
$list = $list->whereIn('id',$ids)->orderByRaw("field(id,".implode(',',$id).")");
但我需要获取除顶部 ID 15 和 20 之外的所有记录。如何实现。
您最好在 PHP 中手动完成此任务,而不是在 MySQL 中。
$keyed_list = $list->keyBy('id');
$ordered_list = collect();
foreach ($ids as $id) {
$ordered_list[] = $keyed_list[$id];
}
//Add the rest of items
$ordered_list = $ordered_list->merge($keyed_list->except($ids));
检查这个答案
$list->sortBy(function($model) use ($ids){
return array_search($model->getKey(), $ids);
}
这里需要使用MySQL派生的table和union
注意:当您使用 union with order by then 时,您必须设置一个限制,否则它将不起作用。
$ids = [15, 20];
DB::table(function($query) use ($ids) {
$query->from('users')
->whereIn('id',$ids)
->orderByRaw("field(id,".implode(',',$ids).")")
->limit(count($ids))
->union(DB::table('users')->whereNotIn('id',$ids));
},'users1')
您的查询:
select * from (
(select * from `users` where `id` in (?, ?) order by field(id,15,20) limit 2)
union
(select * from `users` where `id` not in (?, ?))
) as `users1`