Как отключить загрузку отношений, когда они не нужны в Laravel

можно ли отключить загрузку отношений, но только в некоторых случаях?

Вот мои модели:

class League extends Model
{
    ...

    public function country()
    {
        return $this->belongsTo(Country::class)->with('translations');
    }
}

class Country extends Model
{
    ...

    public function translations()
    {
        return $this->hasMany(CountryTranslation::class, 'country_id');
    }
}

class CountryTranslation extends Model
{
    ...
}

Во многих местах мне нужно загрузить отношения перевода для страны, но на некоторых страницах я хочу отображать информацию только о лиге и ее стране. Там я не хочу показывать коллекцию CountryTranslation.

Вот код этой страницы:

$country = $league->country;

Можно ли только для этой строки отключить отношения?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

он with() просто нетерпеливо загружает переводы, чтобы избежать дополнительных запросов, но вы должны иметь возможность загружать переводы с ним и без него, без with( добавляет дополнительные запросы. https://laravel.com/docs/9.x/eloquent-relationships#eager-loading

Вы захотите изменить:

    public function country()
    {
        return $this->belongsTo(Country::class)->with('translations');
    }

к

    public function country()
    {
        return $this->belongsTo(Country::class);
    }

Если вы хотите загрузить переводы, вы можете сделать это в контроллерах

// if you want translations at some point do this:
$league = League::with('country.translations')
$country = $league->country->translations

// if you do not want translations
$league = League::with('country')
$country = $league->country;

Если вы не хотите трогать:

    public function country()
    {
        return $this->belongsTo(Country::class)->with('translations');
    }

вы можете создать другой метод

    public function countryClean()
    {
        return $this->belongsTo(Country::class);
    }

$country = $league->countryClean;
Ответ принят как подходящий

Итак, вы в настоящее время выясняете одну из причин, по которой вы не определяете нетерпеливую загрузку внутри отношений. Первым предложением было бы удалить with() из определения отношения и добавить его там, где это необходимо. При желании вы можете создать другую связь, в которой включена нетерпеливая загрузка, и она может использовать базовую связь, чтобы сохранить ее СУХОЙ:

public function country()
{
    return $this->belongsTo(Country::class);
}

public function countryWithTranslations()
{
    return $this->country()->with('translations');
}

Если это изменение кода невозможно, вам нужно будет изменить способ доступа к отношениям со странами. Когда вы обращаетесь к атрибуту отношения, он лениво загружает отношение, и у вас нет возможности изменить запрос отношения. Таким образом, вместо доступа к атрибуту отношения вам нужно будет вызвать запрос отношения, чтобы вы могли его изменить.

Поэтому у вас не получится сделать $country = $league->country;, но вы сможете:

$country = $league->country()->without('translations')->first();

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