gpt4 book ai didi

php - 带有动态参数的 Laravel 5 全局作用域

转载 作者:行者123 更新时间:2023-12-03 16:02:45 28 4
gpt4 key购买 nike

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

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

我假设 $model应该是 manager 模型,但由于它是空的,我找不到任何关于它的文档,我不完全确定(如果有人能在评论中告诉我,我会很感激)。这是我们在 Manager 模型中的全局作用域方法:
protected static function boot()
{
parent::boot();

static::addGlobalScope(new ManagerScope);
}

由于全局作用域不需要应用显式方法,我认为可能在引导中添加一些内容可能会允许一个额外的参数,例如:
protected static function boot()
{
parent::boot();

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

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

最佳答案

自然地,全局作用域是自动应用的,无法直接将参数传递给它们。

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

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

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

或者如果管理器信息在某种全局状态(即 session )下可用,您可以创建某种 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());
}

关于php - 带有动态参数的 Laravel 5 全局作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com