вывести все типы грузовиков, сортировкой по имения перевозчика?
У меня всё сделано ровно так, как описано в этой статье. Или это бот?
приводимые тобой примеры, говорят о том , что ты не читал статью по ссылке
Спасибо, добился искомого. Первый вариант с джойном очевидный, я так раньше и делал, но потом перестал, ибо тогда непонятно, почему сразу в DB::Select не подать готовый запрос, который будет лучше читаться. Второй вариант интереснее, но надо подумать, насколько будет хорош запрос вида: select * from "vehicle_types" order by (select "name" from "carriers" where "carriers"."id" = "vehicle_types"."carrier_id") asc, "id" asc А ещё интересный момент, что у меня есть рабочий кусок кода, который почему-то работает: $res = Vehicle::with('matches_color', 'vehicle_type') ->with('carrier', function ($q) { $q->orderBy('name'); }) ->whereHas('carrier', function ($q) { $q->where('user_id', '=', '2'); }) ->orderBy('id') ->get(); Хотя в нём нет ни массива, и он идёт в разрез со статьёй. Надо будет этот кусок переделать, а то как бы он однажды не перестал работать. Ещё раз спасибо.
приведённый тобой пример: ->with('carrier', function ($q) { $q->orderBy('name'); }) зачем здесь сортировка, если там всего одна позиция, а не множество и в твоем примере работает только одна сортировка, по id по поводу join и подзапроса в статье четко указано, что join 1ms, а подзапрос 60ms, разница очевидна
"зачем здесь сортировка, если там всего одна позиция, а не множество" Это недопонимание парадигмы ORM. Если пойти от модели (обзову её $v), то мы её получаем всю, целиком, т.к. не ограничиваем в выборке. Чтобы добраться до моделей, с которыми есть отношения, достаточно обратиться к отношению, как к полю: $v->carrier->name. В этот момент ORM полезет в БД за данными. Чтобы не лезть за данными, применяем with, тогда ORM всё запрашивает изначально и кладёт по полочкам. Да вот беда, порядок полочек определяется моделью $v, и сортировать мы можем только её собственные полочки: $v->orderBy. Не знаю, как для кого, но для меня документация является скудной. Про orderBy написано, что этот метод позволяет сортировать результаты и принимает два параметра, но не понятно, что возвращает. В обсуждаемом нами случае имеет место метод тыка. Видно, что вторым параметром мы передаём коллбек, который возвращает что-то, о чём документация умалчивает, но позволяет сортировать данные. Иногда этот метод приводит к результатам,
открываем апи доку
Ты хочешь сказать, что он сортирует Venicle по полю Carrier::name?
Вся шутка юмора в том, что для Eloquent Builer (Класс Illuminate\Database\Eloquent\Builder) не описан метод orderBy. Только enforceOrderBy()
а ниче что элок наследует кври?)
Join соединяет две таблицы и сортировка идёт по этому соединению
елка тебе не сделает жоин, оно для связи сделает два отдельных запроса и кодом построит дерево
$res = Vehicle::with('matches_color', 'vehicle_type') ->with('carrier', function ($q) { $q->orderBy('name'); }) ->whereHas('carrier', function ($q) { $q->where('user_id', '=', '2'); }) ->orderBy('id') ->get(); Тут?
Ну может до этого можно догадаться, если посмотреть в сырцы.
Стикер
Мы о вот этой статье: https://laravel.demiart.ru/ordering-by-relationship-columns/#belongsTo
Обсуждают сегодня