$projects = Project::find(collect(request()->get('projects'))->pluck('id')); // collect(...)->pluck('id') is [2, 1]
$projects->pluck('id'); // [1, 2]
Я хочу, чтобы результат был в исходном порядке. Как мне этого добиться?






Попробуйте $projects->order_by("updated_at")->pluck("id"); или "created_at", если вам нужно их отсортировать по этой колонке.
Полагаю, у вас есть столбец для сохранения порядка, верно? Затем используйте этот столбец в функции order_by
Ссылка на Порядок 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»).
Это уязвимо для SQL-инъекций. Вы должны использовать что-то вроде $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 отображает все элементы, отсортированные с помощью идентификаторов.
Я реализую функцию перетаскивания-сортировки, пользователи могут сортировать проекты путем перетаскивания. Данные, которые я получаю из request (), - это порядок проектов. Поэтому мне нужно придерживаться первоначального заказа.