Определить тип оператора DML при использовании Global Scopes (Laravel/Eloquent)

Я хочу использовать Eloquent Global Scope, который будет добавлять соединение к каждому запросу select для некоторых моделей. Проблема, с которой я сталкиваюсь, заключается в том, что соединение также добавляется в другие операторы, например, UPDATE, что делает запрос недействительным.

Основная идея функциональности, которую я хочу, заключается в том, что после входа в систему некоторые модели будут возвращать только те данные, к которым имеет доступ зарегистрированный пользователь (прозрачно для разработчика, поскольку это объединение будет добавлено в фоновом режиме с использованием глобальных областей и признаков).

Таким образом, вместо того, чтобы использовать что-то вроде User::available()->get(), я бы хотел использовать User::get(), и "доступная" область должна быть добавлена ​​глобально, основываясь на некоторых условиях...

Это метод применения ScopeInterface:

 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);
    }


}

Любые идеи о том, как обнаружить запрос SELECT?

0 ответов

Другие вопросы по тегам