使用laravel scope避免歧义

vbopmzt1  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(187)

我正在Laravel中创建一个项目,每个公司都有很多部门......每个部门都有一定数量的位置,每个位置都有指定的设备!
由于可能有不同的公司使用这个平台,我创建了一个全局范围,基本上通过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,并且在使用范围时的最终查询没有指定表名。
有没有办法将表名添加到作用域条件中?

rggaifut

rggaifut1#

如果你想在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);
    }
}
uklbhaso

uklbhaso2#

从Laravel 5.5开始,你也可以在qualifyColumn方法中使用这种稍微流畅的语法。

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Scope a query to only include company users.
     */
    public function scopeCompanyUsers(Builder $builder, User $user): void
    {
        return $builder->where($this->qualifyColumn('company_id'), $user->company_id);
    }
}

相关问题