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

Laravel Model::find()自动按id对结果排序,如何停止?,laravel,Laravel,我希望结果保持原来的顺序。我如何做到这一点?试试$projects->order_by(“updated_at”)->pull(“id”)或“创建于”,如果这是您需要排序的列。参考,您几乎可以通过以下方式获得结果并排序: $projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1] $projects->

我希望结果保持原来的顺序。我如何做到这一点?

试试
$projects->order_by(“updated_at”)->pull(“id”)
“创建于”
,如果这是您需要排序的列。

参考,您几乎可以通过以下方式获得结果并排序:

$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]
@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”)。

我正在实现一个可拖动排序功能,用户可以通过拖放对项目进行排序。我从request()获得的数据是项目的顺序。所以我需要坚持原来的顺序。我假设你有一列来保存顺序,对吗?然后在order_by函数中使用该列,这很容易受到SQL注入的影响。您必须使用类似于
$projects\u id=array\u map('intval',request()->get('projects')
$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);