Есть ли у кого-нибудь какие-либо предложения о том, как использовать makeHidden() при нетерпеливой загрузке? вот мой код:
$work=Work::with([
'work_category'=>function($query){
$query->with(['companies'=>function($query){
$query->select('companies.id','companies.name');
}]);
},
'prices',
])
->findOrFail($id);
WorkCategory имеет отношение belongsTo('App\WorkCategory'), а WorkCategory имеет отношение belongsToMany('App\Company') через точку опоры.
Если я попытаюсь связать ->makeHidden('pivot') с $query->select('companies.id','companies.name'); - я получу BadMethodCall exception: Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::makeHidden()
Есть ли что-то, что мне здесь не хватает?
Это код с оскорбительным вызовом makeHidden()
$work=Work::with([
'work_category'=>function($query){
$query->with(['companies'=>function($query){
$query->select('companies.id','companies.name')->makeHidden('pivot');
}]);
},
'prices',
])
->findOrFail($id);
Мое временное решение заключалось в том, чтобы добавить protected $hidden=['pivot']; к моей модели компании, однако было бы неплохо иметь возможность доступа к сводной таблице, когда мне это нужно, и использовать $model->relation->makeHidden('attribute') в моих контроллерах, чтобы обрезать лишние данные перед отправкой.






К сожалению, makeHidden() не работает с отношениями в Laravel. Не напрямую и не используя точечную запись в соответствующем поле.
Вы затронули одно решение, которое я использовал в прошлом, которое заключается в использовании select() для ограничения только полей отношения, которые вы хотите в подзапросе, как несколько грубый способ исключить ваш свод:
$query->with(['companies'=>function($query){
$query->select('id','name', 'something', 'something');
}]);
Это работает, когда поля ограничены. Но это боль, когда у вас много или вы делаете много запросов.
Другой вариант — сделать то, что вы сделали, и отметить это как защищенное на модели: protected $hidden=['pivot'];. Затем у вас есть немного гибкость в различных методах, чтобы использовать ->makeVisible('pivot'); на лету, чтобы восстановить доступ к этой опорной точке.
Если вы когда-нибудь захотите использовать makeHidden(): $work->work_category->companies->each->makeHidden('pivot');
@ Джонас - да. Или цикл foreach. Просто не очень чисто реализовано в Laravel. Я думаю, немного сложнее использовать makeVisible().
Спасибо! Теперь, когда вы просветили меня о методе
makeVisible(), имеет больше смысла скрывать атрибут сводки по умолчанию, поскольку он обычно содержит только избыточную информацию (model_a_id и model_b_id). Таким образом, обходной путь оказывается лучшим решением.