Laravel Model :: find()按ID自动对结果进行排序,如何停止呢?

时间:2018-08-29 18:54:54

标签: laravel

$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]

我希望结果按原始顺序显示。我该如何实现?

3 个答案:

答案 0 :(得分:0)

尝试$projects->order_by("updated_at")->pluck("id");"created_at"(如果您需要对它们进行排序)

答案 1 :(得分:0)

引用MySQL order by field in EloquentMySQL - SELECT ... WHERE id IN (..) - correct order,您可以使用以下方法获得结果并将其排序:

x3::standard_wide::space

@Jonas使我意识到了潜在的sql注入漏洞,所以我建议一种替代方法:

$projects_ids = request()->get('projects'); //assuming this is an array
$projects = Project::orderByRaw("FIELD(id, ".implode(',', projects_ids).")")
    ->find(projects_ids)
    ->pluck('id'));

上面的解释是这样的:

创建一个逗号分隔的占位符'?',用于数组中用作命名绑定的项数(包括列'id')。

答案 2 :(得分:0)

我通过逐个查询数据而不是批量查询来解决这个问题。

$ids = collect(request()->get('projects'))->pluck('id');

foreach($ids as $id){
    $projects[] = Project::find($id);
}

$projects = collect($projects);
$projects->pluck('id');

我必须手动执行此操作,因为 laravel 集合映射了所有使用 id 排序的元素。