2013-08-08 6 views
1

Я создаю онлайн-инструмент для компаний, каждый из которых имеет набор пользователей в Laravel.Добавить условие ко всем запросам в Laravel

Когда пользователь подключен, он имеет $connected_company_id переменную

  • Для каждого запроса SELECT, (вызывается :: все(), найти(), ...), я хотел бы добавить состояние: where company_id = $connected_company_id. Я нашел этот пост: laravel set an automatic where clause, но он не работает, переопределяя newQuery().

  • Для каждого запроса INSERT я хотел бы добавить company_id.

Возможно ли это без изменения моего кода всех контроллеров?

Я думал о распространении Eloquent с помощью customEloquent, а затем сделаю мои модели расширенными customEloquent, но я не знаю, как написать код для customElquent, и если бы он мог работать.

ответ

0

ну, вы можете просто добавить идентификатор компании в запрос поиска. Model::where("company_id","=",$company_id): Или вы можете создать область:

class theModel extends Eloquent { 
    static $company_id; 
    static for_company($company_id){ 
      self::company_id=$company_id; 
      return __CLASS__; 

    } 

    public function scopeCompany($query) 
    { 
     return $query->where('company_id', '=', self::company_id); 
    } 

} 
//And later 
$scope=theModel::for_company($company_id); 
$res=$scope::company->where(...); 

Отказ от ответственности: я не пробовал. Просто решение, которое я построил. Дайте мне знать, если это сработает. Это не будет работать в PHP 5.3

+0

Я знал о областях запросов, на самом деле я хотел бы иметь эту область применения каждый раз, когда я использую данную модель, без необходимости указывать область. Например, модельModel :: all должна уже предоставлять только те модели, у которых есть company_id. Другой момент: это для запросов SELECT, howewer, это не добавляет company_id в save() (cf second bullet point) – edi9999

1

Ну, вы могли бы использовать события яркой модели. Я предполагаю, что у вас есть connected_company_id, хранящийся в сессии company_id

class BaseModel extends Eloquent{ 

    public static function boot(){ 
     parent::boot(); 
     //Column to inject when inserting 
     static::creating(function ($obj){ 
      $obj->company_id = Session::get('company_id'); 
     }); 

     //Column to inject when updating 
     static::updating(function ($obj){ 
      $obj->company_id = Session::get('company_id'); 
     }); 
    } 
} 

Вы можете расширить класс BaseModel на все модели, которые вы хотите company_id быть вставлены или обновлен. Взгляните на Eloquent Model Events для получения дополнительной информации.

Приведенный выше код автоматически добавит или обновит company_id к модели, которую вы продлеваете до BaseModel. Когда вы делаете Model::all() или , вы автоматически получаете company_id на этой Модели, и вы также можете выполнять поиск по вашему запросу в точке «

Надеюсь, это поможет.

+0

Model :: all() и Model :: get() не фильтрует через модели, которые есть 'company_id == Session :: get ('company_id')' здесь. – edi9999

+0

для первого маркера, я нашел это сообщение: http://stackoverflow.com/questions/14271812/laravel-set-an-automatic-where-clause, но он не работает на Laravel 4 (даже newQuery()) – edi9999

+0

Итак, вы хотите, чтобы этот фильтр выполнялся автоматически. Потому что из вашего указателя я вижу, что вы хотите добавить условие где угодно. –

Смежные вопросы