1

我想链接 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()我可以将它们链接起来就好了。

4

1 回答 1

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

笔记

我最初的问题是错误的,因为在这里“链接”任何东西都没有意义,因为全局范围会自动应用于模型。如果我使用 2 个全局范围,则两者都适用。所以这是一个链接函数的问题,它会禁用全局范围的影响。

于 2017-12-08T13:35:11.137 回答