Цепь Laravel черты / сферы

Я хотел бы объединить 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

Решение

Поскольку я был новичком в проекте, я не совсем понимал, что делается, поскольку у меня не было необходимого понимания после того, как эта часть сломалась после обновления. То, что я сделал, было:

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]