Laravel对Eloquent模型数组的动态查询

时间:2017-07-12 12:50:52

标签: php laravel eloquent

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

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

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

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

$queryScope是模型本身中已定义的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'方法适用于我的动态模型,但其他范围会引发错误?我真的希望有人可以帮我解决这个问题。

提前致谢,

学家DOE。

1 个答案:

答案 0 :(得分:0)

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

//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...
    }
}

分享是关怀!