Laravel 如何在不需要时禁用关系加载
How to disable loading of relationships when not needed in 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;
是否只有这一行可以关闭关系?
他 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();
是否可以禁用关系加载,但仅限于某些情况?
这是我的模型:
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();