我想链接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()
这样的本地范围,我可以很好地链接它们。
答案 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个全局范围,则都应用这两个范围。所以这是一个链接功能的问题,这会阻碍全局范围的影响。