具有动态参数的Laravel 5全局示波器

时间:2016-09-01 17:40:08

标签: php laravel laravel-5 laravel-5.2

我们在使用带有动态查询参数的全局范围时遇到问题。全局范围基于经理ID,但$ model为空,$ this指的是经理范围而不是模型,因此$ this-> id是未定义的属性。有没有办法做这样的事情:

public function apply(Builder $builder, Model $model)
{
    return $builder->where('manager', $model->id); // $this->id
}

我假设$model应该是经理模型,但由于它是空的,我找不到任何文件,我不完全确定(如果有人可以告诉我评论我很感激。)这是Manager模型中的全局范围方法:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope(new ManagerScope);
}

由于全局范围不需要应用显式方法,我认为可能在引导中添加一些内容可能允许额外的参数,例如:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope(new ManagerScope($this->id);
}

但这在静态方法中是不允许的,这在看到错误之后才有意义。

1 个答案:

答案 0 :(得分:4)

当然全局范围是自动应用的,并且无法直接将参数传递给它们。

因此,你可以坚持使用动态本地范围,IMO更有意义,

public function scopeForManager($query, $manager)
{
    return $query->where('manager', $manager->id);
}

Document::forManager($manager)->all();

或者如果经理信息在某种全局状态(即会话)中可用,您可以创建某种ManagerResolver类

class ManagerScope
{
    protected $resolver;

    public function __construct(ManagerResolver $resolver)
    {
        $this->resolver = $resolver
    }

    public function apply(Builder $builder, Model $model)
    {
        return $builder->where('manager', $this->resolver->getManagerId());
    }    
}

并将其实例传递到您的范围

protected static function boot()
{
    parent::boot();
    static::addGlobalScope(new ManagerScope(new ManagerResolver());
}