PHP - 存储,检索和运行延迟方法

时间:2016-07-29 20:12:07

标签: php mysql laravel laravel-5.1

我使用Laravel 5.1并为过滤器创建了动态查询。

我通过模型I,想要查询,过滤字段(category_id,review等)以及这些字段中的值。

我在这个领域的传球我希望并且让它的功能得以运行(不要再运行):

$method = $this->getFilterForField($filter_field);

然后我用params调用方法:

$method($query, $filters_array, $user);

查询记录器告诉我查询正在运行两次(见下文)。

如何推迟方法调用,直到我真的想用我的参数运行它?意思是,我可以返回稍后要调用的方法的字符串表示吗?

我知道在PHP中你可以在Strings中包装方法名称并稍后调用它们,如下所示:

$func = 'where'; 
$query->{$func('blah', 'foo')};

$func = 'in_array'; 
$func($needle, $haystack);

或者可以使用显示herecall_user_func,但这并不能帮助我了解如何存储和检索我的方法。

循环:

    $query = $model_class::query();
    foreach ($input as $filter_field => $filters_array) {

        //Get the method
        $method = $this->getFilterForField($filter_field);

        //Run method with params
        $method($query, $filters_array, $user);
        ...

方法:

public function getFilterForField($field)
{
    $filters = [
        'category_id' => function($query, $args, $user = null) {
            return $query->whereIn();
        },
        'review' => function($query, $args, $user = null) {
            if (in_array('yes', $args) && in_array('no', $args)) {
                return $query->orWhereHas();
            } else (in_array('yes', $args) && !in_array('no', $args)) {
                return $query->whereHas();
            }
        }
    ];

    return $filters[$field];
}

如果需要,请查询日志:

使用$method = $this->getFilterForField($filter_field);$method($query, $filters_array, $user);

enter image description here

注释掉方法调用:$method($query, $filters_array, $user);

enter image description here

0 个答案:

没有答案