如何通过动态值数组获取记录顺序?

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`