使用 laravel 范围避免歧义

Posted

技术标签:

【中文标题】使用 laravel 范围避免歧义【英文标题】:avoid ambiguity using laravel scope 【发布时间】:2020-04-24 21:20:20 【问题描述】:

我正在 Laravel 中创建一个项目,其中每个公司都有很多部门......每个部门都有一定数量的 Locations,每个 Location 都分配了设备!

由于不同的公司可能使用该平台,我创建了一个全局范围,基本上按company_id 过滤结果:

class CompanyScope implements Scope

    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    
        return $builder->where('company_id', auth()->user()->company_id);
    

这一切都很好,它会正确过滤,直到我尝试实现以下目标:

Departments::withCount(['locations','devices'])->get();

此时我收到一条错误消息,指出列 company_id 不明确。发生这种情况是因为表 departmentslocationdevices 都有一个列 company_id 和最终查询使用范围时不指定表名。

有没有办法将表名添加到范围条件中?

【问题讨论】:

为了安全起见,也许只是在你的范围内使用departments.company_id 【参考方案1】:

您好,万一将来有人发现疑问...如果您想在 Scope 中指定表格,您可以简单地执行$model->getTable()

class CompanyScope implements Scope

    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    
        return $builder->where($model->getTable().'.company_id', auth()->user()->company_id);
    

【讨论】:

你刚刚为我节省了几个小时和几根白头发。

以上是关于使用 laravel 范围避免歧义的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 的块来避免内存不足?

laravel中带有ajax的范围滑块

避免在 Laravel 控制器中重复代码

Laravel:如何避免时间重叠?

如何在 Laravel 7 中使用原始 SQL 查询创建范围?

使用链式方法的 Laravel 复杂范围查询