因此,我正在制作具有filters
功能的Businesses Web应用程序。我遇到了两个过滤器问题:订购依据和属性(具有以下属性)功能。看起来像这样:
订购者
属性
因此,当单击订购依据选项时,将执行此功能。其中$term
是order_by
get request
参数的值。
BusinessFilter.php
public function orderby($term)
{
if ($term == 'reviews_count') {
return $this->builder
->leftJoin('reviews', 'businesses.id', '=', 'reviews.business_id')
->groupBy('businesses.id')
->selectRaw('businesses.*, COUNT(reviews.id) as reviews_count')
->orderByDesc('reviews_count');
} else if ($term == 'rating') {
return $this->builder
->leftJoin('reviews', 'businesses.id', '=', 'reviews.business_id')
->groupBy('businesses.id')
->selectRaw('businesses.*, AVG(reviews.rating) AS average')
->orderByDesc('average');
} else {
return $this->builder;
}
}
可以,结果正确。
现在,当属性具有一些check boxes
时,将执行此函数,其中$term
是具有一组ID的数组。
BusinessFilter.php
public function attributes($term)
{
$attributes= json_decode($term);
if (count($attributes) == 0) {
return $this->builder;
}
return $this->builder
->select('businesses.*')
->join('business_attribute_value', 'businesses.id', '=', 'business_attribute_value.business_id')
->join('values', 'business_attribute_value.attribute_value_id', '=', 'values.id')
->whereIn('values.id', $attributes)
->groupBy('businesses.id')
->havingRaw('COUNT(*) = ?', [count($attributes)]);
}
结果在这里也是正确的。
现在的问题是,当两个过滤器都具有值时,它会同时执行两个查询,并且不会返回正确的结果。我认为这与联接有关。难道我做错了什么?请帮忙。如果您需要更多信息或代码,请告诉我。谢谢,你是最好的人!
这就是我执行过滤器的方式
public function getSearch(BusinessFilter $filters)
{
$businesses = Business::filter($filters)->paginate(30);
return $businesses;
}
这是QueryFilter
类。基本上,它要做的是遍历每个请求参数并执行上面提到的功能。
class QueryFilters{
protected $request;
protected $builder;
public function __construct( Request $request )
{
$this->request = $request;
}
public function apply(Builder $builder)
{
$this->builder = $builder;
foreach( $this->filters() as $name => $value ){
if( !method_exists($this, $name ) ){
continue;
}
if(strlen($value)){
$this->$name($value);
} else {
$this->$name();
}
}
return $this->builder;
}
public function filters()
{
return $this->request->all();
}
}