Laravel: странное поведение с двумя 'orderBys' - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь использовать два orderBy для фильтрации элементов по их sort_order (то есть 1, 2 и т. Д.) И имени.

Я пробовал практически каждую комбинацию с точки зрения положенияorderBys, восходящий и нисходящий и т. д.

Laravel:

$product_types = ProductType::orderBy('sort_order', 'desc')->orderBy('name, 'asc)->paginate($per_page);

Таблица базы данных:

a busy cat

Результат:

a busy cat

Я хочу, чтобы «Оборудование» было первым, поскольку его sort_order равен 1, «Канцелярские товары» должно быть вторым, поскольку его sort_order равен 2, а затем все остальное после того, чтобы быть в алфавитном порядке отаз.

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Laravel имеет проблемы с сортировкой значений NULL, вы можете использовать одно из этих двух решений для архивации того, что вы хотите:

->orderBy(DB::raw('ISNULL(sort_order), sort_order'), 'ASC')

или:

->orderByRaw('ISNULL(sort_order), sort_order ASC');

, чтобы получитьЗначения NULL сохраняются, а затем объединяются ->orderBy('name'...) как обычно.

Надеюсь, это поможет!

0 голосов
/ 25 октября 2019

Вы можете использовать функцию COALESCE , она вернет первый столбец, который не является нулевым. Смотри:

$product_types = ProductType::orderBy(DB::raw("COALESCE(sort_order, name)"), "asc")
    ->paginate($per_page);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...