Laravel Model :: find()按id自动排序结果,如何阻止这个?

问题描述 投票:0回答:2
$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]

我希望结果是原始顺序。我该如何实现这一目标?

laravel
2个回答
0
投票

尝试使用$projects->order_by("updated_at")->pluck("id");"created_at",如果这是您需要的列。


0
投票

引用MySQL order by field in EloquentMySQL - 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')。

© www.soinside.com 2019 - 2024. All rights reserved.