为Laravel中的所有SQL请求添加WHERE条件

时间:2013-08-08 10:43:25

标签: mysql laravel eloquent

我正在为每个在Laravel中拥有一组用户的公司创建一个在线工具。

当用户连接时,他有一个$connected_company_id变量

  • 对于每个SELECT请求(由:: all(),find(),...)调用,我想添加条件:where company_id = $connected_company_id。我找到了这篇文章:laravel set an automatic where clause,但它不能通过覆盖newQuery()来实现。

  • 对于每个INSERT请求,我想添加company_id。

这可能而不更改所有控制器中的代码吗?

我考虑过使用customEloquent扩展Eloquent,然后让我的模型扩展customEloquent,但我不知道如何编写customEloquent的代码以及它是否可行。

2 个答案:

答案 0 :(得分:1)

好吧,你可以利用Eloquent模型事件。我假设您已将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');
         });
   }
}

您可以在希望插入或更新company_id的所有模型上扩展BaseModel类。有关详细信息,请查看Eloquent Model Events

上述代码会自动将company_id插入或更新到您将BaseModel扩展到的模型。当您执行Model::all()Model::get()时,您会自动获取该模型上的company_id,并且您还可以按照Point上的要求执行搜索。

希望这会有所帮助。

答案 1 :(得分:0)

好吧,您可以将公司ID添加到查询查询中。 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

下无效