如何在laravel模型中添加约束以增加负载

时间:2019-06-06 13:31:55

标签: laravel eloquent model constraints eager-loading

我在模型中使用$ 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属性中使用它,但是这样关系名称被更改,我们必须为每种语言和其他问题创建一个关系。

谢谢。

1 个答案:

答案 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');
                }]);
        });
    }
}