169 похожих чатов

Т.Е. на один тип грузовика, один перевозчик и тебе надо

вывести все типы грузовиков, сортировкой по имения перевозчика?

16 ответов

23 просмотра

У меня всё сделано ровно так, как описано в этой статье. Или это бот?

Egor-Gruzdev Автор вопроса

приводимые тобой примеры, говорят о том , что ты не читал статью по ссылке

Спасибо, добился искомого. Первый вариант с джойном очевидный, я так раньше и делал, но потом перестал, ибо тогда непонятно, почему сразу в 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(); Хотя в нём нет ни массива, и он идёт в разрез со статьёй. Надо будет этот кусок переделать, а то как бы он однажды не перестал работать. Ещё раз спасибо.

Egor-Gruzdev Автор вопроса

приведённый тобой пример: ->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

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта