繁体   English   中英

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

[英]How to add constrain to eager load in laravel model

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

谢谢。

我认为您想在每次获得类别时都渴望加载英语项目。

我认为这是全局范围的完美用例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM