无法弄清楚加入

时间:2020-07-22 13:14:50

标签: laravel eloquent query-builder laravel-query-builder

因此,我正在制作具有filters功能的Businesses Web应用程序。我遇到了两个过滤器问题:订购依据属性(具有以下属性)功能。看起来像这样:

订购者

  • 评分最高(单选按钮
  • 大多数评论(单选按钮

属性

  • 接受信用卡(复选框
  • 接受事件(复选框
  • 酒精(复选框
  • 交付(复选框
  • 吸烟(复选框

因此,当单击订购依据选项时,将执行此功能。其中$termorder_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();
    }
}

0 个答案:

没有答案