Порядок в Laravel от отношений

116

Я просматриваю все комментарии, оставленные автором конкретного сообщения.

foreach($post->user->comments as $comment)
    {
        echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>";
    }

Это дает мне

I love this post (3)
This is a comment (5)
This is the second Comment (3)

Как мне заказать по post_id, чтобы указанный выше список был упорядочен как 3,3,5

PrestonDocks
источник

Ответы:

247

Связь можно расширить с помощью функций запроса:

<?php
public function comments()
{
    return $this->hasMany('Comment')->orderBy('column');
}

[редактировать после комментария]

<?php
class User
{
    public function comments()
    {
        return $this->hasMany('Comment');
    }
}

class Controller
{
    public function index()
    {
        $column = Input::get('orderBy', 'defaultColumn');
        $comments = User::find(1)->comments()->orderBy($column)->get();

        // use $comments in the template
    }
}

Модель пользователя по умолчанию + простой пример контроллера; при получении списка комментариев просто примените orderBy () на основе Input :: get (). (обязательно сделайте некоторую проверку ввода;))

Роб Гордин
источник
2
Кто-то уже предлагал это на форуме Laravel, но я хочу иметь возможность делать это в контроллере, чтобы я мог выбирать, какое поле сортировать на основе ввода данных пользователем. Может быть, мне следовало прояснить это в вопросе.
PrestonDocks
Я добавил второй пример
Роб Гордийн
1
Спасибо, Роб, ты наставил меня на правильный путь. Фактический ответ был $ comments = User :: find (10) -> comments () -> orderBy ('post_id') -> get (); Казалось, для работы нужен метод get (). Если вы можете добавить к своему ответу get (), я отмечу его как принятый.
PrestonDocks
2
Это хорошо работает, если вы извлекаете одну запись, но если вы извлекаете несколько записей, вам понадобится что-то большее, например, stackoverflow.com/a/26130907/1494454
dangel
Если вы используете строгий режим mysql, который используется по умолчанию в Laravel 5.4, f.ex вы получите SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1140 Смешивание столбцов GROUP ...
Сабина,
9

Я считаю, что вы также можете:

$sortDirection = 'desc';

$user->with(['comments' => function ($query) use ($sortDirection) {
    $query->orderBy('column', $sortDirection);
}]);

Это позволяет запускать произвольную логику для каждой связанной записи комментария. У вас может быть что-то вроде:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);
agm1984
источник
1
Нет. Я пробовал это, не работает. Вот мой случай: у меня есть две таблицы ( appointmentsи schedules), запрос простой: получить appointmentsзаказ по schedules. datetimeпо убыванию. У меня есть решение, добавив новый столбец в таблицу appointmentsдля хранения datetimeиз таблицы schedules. А теперь мне осталось только заказать appointments. datetimeЯ знаю, что это не лучший способ, но он решает проблему. XD
Фенди Сетиаван
Спасибо большое, в моем случае это сработало, это было потрясающе.
Пориа Хонарманд