Laravel Model :: find () автоматически сортирует результаты по идентификатору, как это остановить?

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
194
3

Ответы 3

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

Я реализую функцию перетаскивания-сортировки, пользователи могут сортировать проекты путем перетаскивания. Данные, которые я получаю из request (), - это порядок проектов. Поэтому мне нужно придерживаться первоначального заказа.

Joshua Leung 29.08.2018 21:10

Полагаю, у вас есть столбец для сохранения порядка, верно? Затем используйте этот столбец в функции order_by

latr.88 29.08.2018 21:39

Ссылка на Порядок 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'));.

Jonas Staudenmeir 29.08.2018 21:43

Я решаю эту проблему, запрашивая данные по одному вместо массового запроса.

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

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

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

Мне приходится делать это вручную, потому что коллекция laravel отображает все элементы, отсортированные с помощью идентификаторов.

Другие вопросы по теме