【发布时间】:2019-02-04 15:36:02
【问题描述】:
$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]
我希望结果是原始顺序。我如何做到这一点?
【问题讨论】:
标签: laravel
$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]
我希望结果是原始顺序。我如何做到这一点?
【问题讨论】:
标签: laravel
试试$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”)。
【讨论】:
$projects_ids = array_map('intval', request()->get('projects'));之类的东西。
我通过逐一查询数据而不是批量查询来解决这个问题。
$ids = collect(request()->get('projects'))->pluck('id');
foreach($ids as $id){
$projects[] = Project::find($id);
}
$projects = collect($projects);
$projects->pluck('id');
我必须手动执行此操作,因为 laravel 集合映射所有使用 id 排序的元素。
【讨论】: