如何通过动态值数组获取记录顺序?
Posted
技术标签:
【中文标题】如何通过动态值数组获取记录顺序?【英文标题】:How to get Records order by dynamic array of values? 【发布时间】:2021-11-08 18:36:15 【问题描述】:我需要获取 Records 以便一组 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 之外的所有记录。如何做到这一点。
【问题讨论】:
【参考方案1】:这里需要使用mysql派生表和union
注意:当你在订单中使用 union 时,你必须设置一个限制,否则它将不起作用。
$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`
【讨论】:
不错的答案。我最好在这里使用完全原始的查询而不是查询生成器。因为构建器没有帮助,反而增加了更多的复杂性。【参考方案2】:您最好在 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));
【讨论】:
感谢您的宝贵时间! :)【参考方案3】:检查这个答案https://***.com/a/38574861/11219477
$list->sortBy(function($model) use ($ids)
return array_search($model->getKey(), $ids);
【讨论】:
感谢您的回答。感谢您的时间。但就我而言,我需要在获取数据之前执行此操作。我也在使用 take(10)。所以 10 条记录可能有也可能没有那个 id。以上是关于如何通过动态值数组获取记录顺序?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 GraphQL 中的过滤器和顺序动态创建/获取数据?
如何在 for 循环中使用动态键值从 JSON 数组获取值?科特林