我使用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);
或者可以使用显示here的call_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);
:
注释掉方法调用:$method($query, $filters_array, $user);