我在模型中使用$ with属性来进行急切的加载关系,现在我需要添加约束来进行急切的加载。我该怎么办?
简单的渴望负载:
class Category extends Model
{
protected $table = 'categories';
protected $fillable = ['slug', 'lang','category', 'complex_id'];
protected $with = ['items'];
}
我想做的是这样的:
class Category extends Model
{
protected $table = 'categories';
protected $fillable = ['slug', 'lang', 'category', 'complex_id'];
protected $with = ['items' => function ($q) {
$q->where('lang', 'en');
}];
}
但这在php中是不允许的,并且我得到“常量表达式包含无效操作”异常。
还可以添加其他关系,例如:
public function englishItems()
{
return $this->hasOne('App\Item', 'category_id')->where(['lang' => 'en']);
}
并在$ with属性中使用它,但是这样关系名称被更改,我们必须为每种语言和其他问题创建一个关系。
谢谢。
答案 0 :(得分:1)
我认为您想在每次获得类别时都渴望加载英语项目。
我认为这是全局范围的完美用例:
https://laravel.com/docs/5.8/eloquent#global-scopes
因此,在类别模型中,您可以定义以下内容:
class Category extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('withEnglishItems', function (Builder $builder) {
$builder->with(['items' => function ($query) {
$query->where('lang', 'en');
}]);
});
}
}