Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用全局作用域时检测DML语句的类型(Laravel/Eloquent)_Php_Laravel_Eloquent_Global Scope - Fatal编程技术网

Php 使用全局作用域时检测DML语句的类型(Laravel/Eloquent)

Php 使用全局作用域时检测DML语句的类型(Laravel/Eloquent),php,laravel,eloquent,global-scope,Php,Laravel,Eloquent,Global Scope,我想使用一个雄辩的全局范围,它将为某些模型的每个select查询添加一个联接。我面临的问题是,连接也被添加到其他语句中,例如UPDATE,这使得查询无效 我想要的功能的主要思想是,在登录后,一些模型将只返回登录用户有权访问的数据(对开发人员来说是透明的,因为此连接将通过使用全局范围和特征在后台添加) 因此,我希望使用User::accessible()->get(),而不是使用User::accessible(),并且应该根据某些条件全局添加“accessible”范围 这是ScopeInter

我想使用一个雄辩的全局范围,它将为某些模型的每个select查询添加一个联接。我面临的问题是,连接也被添加到其他语句中,例如UPDATE,这使得查询无效

我想要的功能的主要思想是,在登录后,一些模型将只返回登录用户有权访问的数据(对开发人员来说是透明的,因为此连接将通过使用全局范围和特征在后台添加)

因此,我希望使用User::accessible()->get(),而不是使用User::accessible(),并且应该根据某些条件全局添加“accessible”范围

这是ScopeInterface的apply方法:

 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等。因此,除非您可以推迟应用范围,否则在调用这些方法之前,生成器对象不知道它的类型。这是因为在最后一次调用之前,在每种类型的查询中都使用相同的结构来选择列,因此语法将启动并构建正确的结构。谢谢。由于无法检测查询的类型,我最终使用了普通查询范围。与上面的注释一样,在作用域运行时还没有应用查询类型。