можно ли отключить загрузку отношений, но только в некоторых случаях?
Вот мои модели:
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;
Можно ли только для этой строки отключить отношения?
он 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();