Php 使用全局作用域时检测DML语句的类型(Laravel/Eloquent)
我想使用一个雄辩的全局范围,它将为某些模型的每个select查询添加一个联接。我面临的问题是,连接也被添加到其他语句中,例如UPDATE,这使得查询无效 我想要的功能的主要思想是,在登录后,一些模型将只返回登录用户有权访问的数据(对开发人员来说是透明的,因为此连接将通过使用全局范围和特征在后台添加) 因此,我希望使用User::accessible()->get(),而不是使用User::accessible(),并且应该根据某些条件全局添加“accessible”范围 这是ScopeInterface的apply方法:Php 使用全局作用域时检测DML语句的类型(Laravel/Eloquent),php,laravel,eloquent,global-scope,Php,Laravel,Eloquent,Global Scope,我想使用一个雄辩的全局范围,它将为某些模型的每个select查询添加一个联接。我面临的问题是,连接也被添加到其他语句中,例如UPDATE,这使得查询无效 我想要的功能的主要思想是,在登录后,一些模型将只返回登录用户有权访问的数据(对开发人员来说是透明的,因为此连接将通过使用全局范围和特征在后台添加) 因此,我希望使用User::accessible()->get(),而不是使用User::accessible(),并且应该根据某些条件全局添加“accessible”范围 这是ScopeInter
public function apply(Builder $builder)
{
$table = $builder->getModel()->getTable();
$companyLevel = $builder->getModel()->_getCompanyLevel();
//I would like to detect if this is a SELECT query here, somehow...
if ($companyLevel !== null) {
$columns = $builder->getQuery()->columns;
//if all columns or no specified columns
if((count($columns)==1 && $columns[0]=='*') || count($columns)==0) {
$builder->getQuery()->select([$table.'.*']);
}
$builder->getQuery()
->join('spaces',$table.'.space_id','=','spaces.id')
->where('spaces.level','>',$companyLevel);
}
}
关于如何检测选择查询有什么想法吗?最终的方法是get、update、delete、increment等,它们决定了是否是SELECT、update、delete等。因此,除非您可以推迟应用范围,否则在调用这些方法之前,生成器对象不知道它的类型。这是因为在最后一次调用之前,在每种类型的查询中都使用相同的结构来选择列,因此语法将启动并构建正确的结构。谢谢。由于无法检测查询的类型,我最终使用了普通查询范围。与上面的注释一样,在作用域运行时还没有应用查询类型。