Выборочная сортировка в Laravel в зависимости от значения столбца - PullRequest
0 голосов
/ 08 июня 2018

Я хочу отсортировать записи в таблице.Вот красноречивая модель.

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * App\Story
 ...
 * @property string $due_date
 * @property string $status late|scheduled|completed
 ...
 */
class Story extends Model {
    ...
}

Порядок, в котором я хочу вернуть Истории:

  • "поздно" - ASC (Сначала старше)
  • "запланировано" в DSC (сначала новый)
  • "выполнено" в DSC (сначала сначала)

Итак, давайте предположим, что в дБ для каждого типа статуса есть 15 записей.и предел разбиения на страницы установлен равным 20.

, поэтому вот ответ каждой страницы

  • Первая страница: 15 поздних историй в порядке ASC + первые 5 запланированных историй в порядке DSC
  • Вторая страница: оставшиеся 10 запланированных историй + первые 10 завершенных историй в порядке DSC
  • Третья страница: оставшиеся 5 завершенных историй

Пожалуйста, дайте мне знать, еслиприведенная выше информация не является достаточной.Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Не идеально, но работает без столбца factor:

Story::orderByRaw('FIELD(status, "late", "scheduled", "completed")')
    ->orderByRaw('(CASE WHEN status = "late" THEN 1 ELSE -1 END) * due_date')
    ->paginate(10);

При умножении на целое число, due_date автоматически преобразуется в строку (20180609).Так что это должно быть быстрее, чем timestamp(due_date).

0 голосов
/ 08 июня 2018

В некоторых случаях вы можете захотеть использовать пользовательский заказ sql для определенного столбца.Для этого вы можете использовать orderColumn api.

В этом примере мы закажем имя столбца с нулями в качестве последнего результата.

use DataTables;

Route::get('user-data', function() {
$model = App\User::query();

return DataTables::eloquent($model)
            ->orderColumn('name', '-name $1')
            ->toJson();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...