Я думаю, что вы ищете with()
.
Прежде чем я до этого доберусь, у вас на самом деле есть большая проблема, чем кажется. Матей Михай на самом деле коснулся этого.
Когда у вас есть что-то вроде $Customer->Equipment
, вы фактически используете «динамические свойства» Eloquent. Это означает, что где-то есть волшебство __get()
, которое говорит, что в целевой модели отсутствует желаемое свойство, проверьте, есть ли у него метод отношения с таким именем. И если да, то отложите его, если он еще не загружен через with()
или load()
.
Так что, когда вы делаете $Customer->Equipment
, это в основном ярлык для $Customer->Equipment()->get()
.
Следующее, что нужно учитывать, это то, что результатом get()
является Eloquent \ Collection , который является дочерним классом для Support \ Collections . А у Support \ Collections есть собственная версия метода where()
.
Все это говорит о том, что $Customer->Equipment->where('SNStatus', 'SHIPPED')
делает не результатом выполнения запроса, который выглядит следующим образом:
SELECT * FROM Equipment WHERE customerID = ? AND SNStatus = 'SHIPPED'
Вместо этого вы запускаете:
SELECT * FROM Equipment WHERE customerID = ?
И затем попросить класс Collection отфильтровать результирующий набор как SNStatus='SHIPPED'
, а затем . Это может привести к огромному снижению производительности и даже к максимальному увеличению ОЗУ серверов в зависимости от размера этих таблиц. Я думаю, что вы действительно ищете, это:
$Customer->Equipment()->where('SNStatus', 'SHIPPED')->get()
Вызывая реальный метод Equipment()
, а не динамическое свойство, вы говорите Eloquent, что вы еще не совсем готовы к выполнению запроса, поскольку вы все еще добавляете к нему условия.
(Также как примечание, ваше соглашение об именах немного вредит моему OCD, методы всегда должны быть "camelCased". Только имена классов имеют свою первую букву в верхнем регистре.)
Итак ... вернемся к вопросу, который вы на самом деле задали, и включая понимание разницы между Model::where()
и Collection::where()
, то, что мы имеем, выглядит примерно так:
$resutls = $Customer->Equipment()->with(['Part'])->where('SNStatus', 'SHIPPED')->get();
Поскольку вы хотели указать пару полей в таблице деталей, которые вам действительно нужны, вы можете использовать ограниченную готовую нагрузку
$resutls = $Customer->Equipment()->with(['Part' => function (Illuminate\Database\Eloquent\Builder $query) {
$query->select([
'PartNum', //Per Equipment::Part(), This needs to be there for the relation to be mated with its parent
'ClassID',
'PartDescription'
]);
// Since PHP always handles objects by-reference, you don't actually need to return $query after having altered it here.
}])->where('SNStatus', 'SHIPPED')->get();
Это даст вам вложенный объект Part
с полями, которые вам нужны для каждого Equipment
элемента модели в результатах Eloquent\Collection
.
Что касается того, как обрабатывать эти результаты в вашем блейд-файле, я расскажу об этом Матею Михаю, я думаю, что ответ довольно хороший.