Chain Laravel特征/范围

时间:2017-11-27 07:45:40

标签: php laravel global-scope

我想链接2个可通过我所做的特征访问的全球范围。

trait ActivatedTrait
{
    public static function bootActivatedTrait()
    {
        static::addGlobalScope(new ActivatedScope);
    }

    public static function withInactive()
    {
        $instance = new static;
        return $instance->newQueryWithoutScope(new ActivatedScope);
    }
}

trait PublishedTrait
{
    public static function bootPublishedTrait()
    {
        static::addGlobalScope(new PublishedScope);
    }

    public static function withUnpublished()
    {
        $instance = new static;
        return $instance->newQueryWithoutScope(new PublishedScope);
    }
}

当我像这样调用我的模型时,它可以正常工作

MyModel::withInactive()
MyModel::withUnpublished()

但这不是

MyModel::withInactive()->withUnpublished()

修改

出于某种原因,这段代码在Laravel 4.2下运行,但我切换到5.5,现在它已经崩溃了。

编辑2

如果我制作像scopeWithInactive()scopeWithUnpublished()这样的本地范围,我可以很好地链接它们。

1 个答案:

答案 0 :(得分:1)

由于我是这个项目的新手,因为在升级后该部分中断后我没有获得所需的洞察力,所以我并不完全理解所做的工作。我做的是:

消除特征,添加了正常的L 5.5全局范围(每个范围仅提取活动项目)

class ActivatedScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('content.is_active', 1);
    }
}

在模型中启动它们

protected static function boot()
{
    parent::boot();
    static::addGlobalScope(new ActivatedScope());
    static::addGlobalScope(new PublishedScope());
}

并添加了取消其效果的本地范围:

public function scopeWithInactive($query)
{
    return $query->withoutGlobalScope(ActivatedScope::class);
}

这使我能够这样做:

Item::all() // <- only active and published items

Item::withInactive()->get() // <- published items which are either active or inactive

Item.:withInactive()->withUnpublished()->get() // <- all items from DB

注意

我最初的问题是错误的,因为&#34;链接&#34;这里有任何东西,因为全局范围自动应用于模型。如果我使用2个全局范围,则都应用这两个范围。所以这是一个链接功能的问题,这会阻碍全局范围的影响。