Я хотел бы объединить 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()
Я могу просто цеплять их.
Поскольку я был новичком в проекте, я не совсем понимал, что делается, поскольку у меня не было необходимого понимания после того, как эта часть сломалась после обновления. То, что я сделал, было:
Устранены черты, добавлены обычные глобальные области действия 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 глобальные области, применяются оба. Таким образом, речь шла о цепочке функций, которые отключали бы эффект глобальной области видимости.
Других решений пока нет …