$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]
我希望结果是原始顺序。我该如何实现这一目标?
尝试使用$projects->order_by("updated_at")->pluck("id");
或"created_at"
,如果这是您需要的列。
引用MySQL order by field in Eloquent和MySQL - SELECT ... WHERE id IN (..) - correct order你几乎可以得到结果,并使用以下命令:
$projects_ids = request()->get('projects'); //assuming this is an array
$projects = Project::orderByRaw("FIELD(id, ".implode(',', projects_ids).")")
->find(projects_ids)
->pluck('id'));
@Jonas提高了我对潜在的sql注入漏洞的认识,所以我建议一个替代方案:
$projects_ids = request()->get('projects');
$items = collect($projects_ids);
$fields = $items->map(function ($ids){
return '?';
})->implode(',');
$projects = Project::orderbyRaw("FIELD (id, ".$fields.")", $items->prepend('id'))
->find($projects_ids);
对上述的解释如下:
创建一个逗号分隔的占位符'?',表示数组中的项目数用作命名绑定(包括列'id')。