【问题标题】:Add WHERE condition to all SQL requests in Laravel在 Laravel 中为所有 SQL 请求添加 WHERE 条件
【发布时间】:2013-08-10 01:06:22
【问题描述】:

我正在为在 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 编写代码以及它是否可以工作。

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    好吧,您可以将公司 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 下不起作用

    【讨论】:

    • 我知道查询范围,实际上我希望每次使用给定模型时都有这个范围,而不必指定范围。例如 theModel::all 应该已经只给出了那些具有 company_id 的模型。另一点:这是针对 SELECT 请求的,但是,这不会在 save() 上添加 company_id(参见第二个要点)
    【解决方案2】:

    好吧,您可以使用 Eloquent 模型事件。我假设您将 connected_company_id 存储在 Session 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 上的请求执行搜索`

    希望这会有所帮助。

    【讨论】:

    • Model::all() 和 Model::get() 不会过滤这里有company_id==Session::get('company_id') 的模型。
    • 对于第一个要点,我找到了这篇文章:stackoverflow.com/questions/14271812/…,但它似乎不适用于 Laravel 4(甚至 newQuery())
    • 所以你想让过滤器自动完成。因为从你的指针我看到你想在每个地方添加条件。
    • 是的,我希望在所有 BaseModel 类上自动完成过滤。
    猜你喜欢
    • 2019-11-18
    • 2017-03-25
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多