【问题标题】:Laravel dynamic queries on array of Eloquent modelsLaravel 对 Eloquent 模型数组的动态查询
【发布时间】:2017-07-12 12:50:52
【问题描述】:

我目前正在尝试在数组中定义的模型上创建一个调用不同范围查询的函数,例如 scopeByLocation()scopeByPublished()。我已经通过 [this link][1] 了解了基础知识。但是,当尝试访问在相应模型中定义的自定义查询范围时,我收到以下错误:"Call to undefined method Illuminate\Database\Query\Builder::ForLocation($location)->get()"

我想要实现的是一个单一的方法,它遍历模型数组中的每个模型并检索和调用模型上的正确 scopeQuery,如下所示:

$modelElements = $model::{$queryScope}();

例如$model = 'Modules\News\Models\Article'

$queryScope 是模型本身中定义的查询范围。例如。 scopeForLocation($location).

我已经测试了$queryScope = 'all' 并且得到了很好的结果,但是当我尝试访问存在于例如 Location 模型中的自定义 queryScope ($queryScope = 'ForLocation($location)->get') 时,我收到以下错误:"Call to undefined method Illuminate\Database\Query\Builder::ForLocation($location)->get()" .

所以这一切都发生在一个 foreach 循环中,其中我的模型数组中的每个模型都被调用,然后在模型上调用相应的 queryScope。

为什么$queryScope = 'all' 方法适用于我的动态模型,但其他作用域抛出错误?我真的希望有人能帮助我在这个问题上找到正确的方向。

提前致谢,

J。能源部。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    好的,我终于通过以下方式解决了:

    //array of models
    public function models()
    {
        return [
            'Modules\Website\Models\Article', 
             ...
            ];
    }
    
    //function that retrieves all elements for a model
    public function getAllElementsForModel($model, $param)
    {
        //instantiate model
        $model = new $model;
    
        //call queryScope
        //'queryScope' could be any queryScope that is defined within your model(s),
        //the parameters are needed for the associated queryScope
        $query = call_user_func_array([$model, 'queryScope'], [$param1, $param2]);
    
        $result = $query->get();
    
        //do stuff with your $result
    }
    
    
    //retrieves all 
    public function all($param)
    {
        //loop through the array of models
        foreach($this->models() as $model){
    
            $this->getAllElementsForModel($model, $param);
            //do stuff here...
        }
    }
    

    分享就是关怀!

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      相关资源
      最近更新 更多