Laravel Model :: find () автоматически сортирует результаты по id, как это остановить? - PullRequest
0 голосов
/ 29 августа 2018
$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]

Я хочу, чтобы результат был в исходном порядке. Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Ссылка MySQL упорядочить по полю в Eloquent и MySQL - SELECT ... WHERE ID IN (..) - правильный порядок Вы можете в значительной степени получить результат и получить его порядок используя следующее:

$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').

0 голосов
/ 29 августа 2018

Попробуйте $projects->order_by("updated_at")->pluck("id"); или "created_at", если вы нуждаетесь в этом столбце, упорядоченном по.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...