Query \ Builder лучше всего рассматривать как основной инструмент, используемый Eloquent, но, тем не менее, это совершенно другой пакет. Цель Query \ Builder состоит в том, чтобы отделить SQL синтаксис от логики c, которая в него подается, тогда как цель Eloquent состоит в том, чтобы отделить этот лог c от структур таблиц и связей. Так что только Eloquent поддерживает классы Model и Relation, а Query \ Builder - нет. И то, что вы просите, имеет отношение к отношениям, так что, короче говоря, вы как бы лаете не на то дерево.
Кстати, я здесь дифференцирую 'Query \ Builder', потому что Eloquent также имеет собственную оболочку для этого класса под названием Eloquent\Builder
, которая использует большую часть того же синтаксиса. К счастью или к несчастью, Eloquent пытается позволить разработчику взаимодействовать с ним знакомым образом; не нужно отслеживать новый набор имен методов, даже если вы без проблем выпали из Eloquent в объект Query \ Builder с помощью метода magi c __call
. Это также делает нечто подобное в отношении Eloquent \ Collections vs. Support \ Collections. Но поначалу это может очень запутать, потому что вам просто нужно знать, с каким пакетом вы разговариваете.
Итак, чтобы ответить на ваш вопрос ...
Следует также отметить, что with()
не просит Eloquent выполнить JOIN
. Все, что он делает, - это запускает родительский запрос, извлекает значения ключей из результата, запускает дочерний запрос, используя их в операторе IN()
, и впоследствии объединяет результаты. Вот что приводит к вложенным результатам. Исходя из опыта, это своего рода беспорядок, генерирующий настоящие операторы JOIN из Model Relations и сохраняющий псевдонимы таблиц уникальными, поэтому имеет смысл, что этот пакет просто пропускает попытки сделать это (за исключением сводных таблиц в отношениях «многие ко многим»). Это также имеет дополнительное преимущество: ваши связанные таблицы не обязательно должны находиться в одной базе данных. С другой стороны, Query \ Builder join()
, как и у вас, будет представлять все поля для всех таблиц на верхнем уровне.