Как я могу создать цепочку ->makeHidden() при нетерпеливой загрузке отношения ownToMany?

Есть ли у кого-нибудь какие-либо предложения о том, как использовать 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') в моих контроллерах, чтобы обрезать лишние данные перед отправкой.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
4
0
2 558
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, makeHidden() не работает с отношениями в Laravel. Не напрямую и не используя точечную запись в соответствующем поле.

Вы затронули одно решение, которое я использовал в прошлом, которое заключается в использовании select() для ограничения только полей отношения, которые вы хотите в подзапросе, как несколько грубый способ исключить ваш свод:

$query->with(['companies'=>function($query){
     $query->select('id','name', 'something', 'something');
}]);

Это работает, когда поля ограничены. Но это боль, когда у вас много или вы делаете много запросов.

Другой вариант — сделать то, что вы сделали, и отметить это как защищенное на модели: protected $hidden=['pivot'];. Затем у вас есть немного гибкость в различных методах, чтобы использовать ->makeVisible('pivot'); на лету, чтобы восстановить доступ к этой опорной точке.

Спасибо! Теперь, когда вы просветили меня о методе makeVisible(), имеет больше смысла скрывать атрибут сводки по умолчанию, поскольку он обычно содержит только избыточную информацию (model_a_id и model_b_id). Таким образом, обходной путь оказывается лучшим решением.

Claude Kirke 14.07.2019 17:17

Если вы когда-нибудь захотите использовать makeHidden(): $work->work_category->companies->each->makeHidden('pivot');

Jonas Staudenmeir 14.07.2019 17:24

@ Джонас - да. Или цикл foreach. Просто не очень чисто реализовано в Laravel. Я думаю, немного сложнее использовать makeVisible().

Watercayman 14.07.2019 17:27

Другие вопросы по теме