внутренний заказBy перезаписывается внешним заказомBy в Laravel Eloquent - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть связь User hasOne Position, и я выбираю пользователей, но я хочу отсортировать их сначала по Position->name, а затем по User->name. Я попробовал следующее

<?php
$sorted = Position::where('groupId', $this->groupId)
    ->whereIn('id', $positions)
    ->with(['user' => function($query) {
        $query->orderBy('user.name'); // internal sort
    }])
    ->orderBy('position.name') // external sort
    ->get();

Таким образом, результаты сортируются только по внешней сортировке или по позиции-> имя. Разные пользователи с одинаковыми позициями-> именами перечислены в несортированном виде. Если я удаляю внешнюю сортировку и оставляю только имя пользователя sortBy->, оно работает, НО только для имен, а позиции случайные.

Я пробовал разные способы

  • установка порядка в отношении Position->user, не работает
  • установка порядка в отношении User->position, не работает
  • определение только внешнего orderBy('position.name, user.name'), вылетает, говоря пользовательская таблица отсутствует в запросе.

Я также пытался ответить на подобные вопросы, такие как

, но, похоже, они не пытаются отсортировать результаты как по родителю, так и по взаимосвязи. Кажется, мое единственное решение - просмотреть результаты и отсортировать их в PHP вместо базы данных, но это звучит глупо.

Пожалуйста, совет, спасибо.

1 Ответ

1 голос
/ 19 апреля 2020

Если вы хотите отсортировать родительский элемент Position по отношению User, вам нужно использовать join():

$sorted = Position::where(...)
->whereIn(...)
->with('user')
->join('users', 'users.id', '=', 'positions.user_id') // Or whatever the join logic is
->orderBy('users.name')
->orderBy('positions.name')
->get();

Примечание: orderBy() в отношении user в with() не кажется необходимым, так как по соглашению отношения с именами в единственном числе должны возвращать только 1 запись, а сортировка по одной записи не имеет смысла.

Это вернет Collection из Position модели, с прикрепленной User моделью, отсортированные по имени пользователя, а затем по названию позиции. Возможно, вам придется добавить select('positions.*'), чтобы избежать проблем с неоднозначностью, но это должно дать вам общее представление.

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