Замовлення Ларавеля


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

Відповіді:


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 = Користувач :: 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 ...
Сабіне

8

Я вірю, що ви також можете зробити:

$sortDirection = 'desc';

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

Це дозволяє виконувати довільну логіку для кожного пов'язаного запису коментарів. У вас можуть бути такі речі, як:

$query->where('timestamp', '<', $someTime)->orderBy('timestamp', $sortDirection);

1
Ні. Я спробував це, це не працює. Ось мій випадок: у мене дві таблиці ( appointmentsі schedules), запит простий: отримати appointmentsзамовлення по schedules. datetimeнизхідний. У мене є рішення, додавши новий стовпчик у таблицю appointmentsдля зберігання datetimeз таблиці schedules. А тепер мені потрібно лише замовити appointments. datetimeЯ знаю, що це не найкращий метод, але це вирішує проблему. XD
Fendi Setiawan

Дякую вам, що це спрацювало, і в моєму випадку це було дивовижно.
Pooria Honarmand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.