2016-01-27 2 views
1

Когда я присоединяюсь к одной таблице к другой, я получил эту ошибку. я поставил в качестве ключевого слова, но ее не работает он дает мне ошибку, как поле не нашел, как я могу решить эту ошибкуЯ нашел ошибку в запросе, когда я присоединяюсь к другой таблице

Код:

Product::leftjoin('reviews','products.id','=','reviews.productID') 
          ->select(array('products.*', 
            DB::raw('AVG(rating) as ratings_average') 
           )) 
         ->where(function($query) use ($categoriesID,$brands,$priceArray,$ratingArray) 
          { 
           $query->whereIn('categoryID',$categoriesID); 
           if(count($brands) > 0) 
           { 
            $query->whereIn('brandID',$brands); 
           } 
           $query->whereBetween('productSellingPrice',$priceArray); 
           if(count($ratingArray) > 0) 
           { 
            $query->whereBetween('ratings_average',$ratingArray); 
           } 
          }) 
         ->groupBy('products.id') 
         ->get(); 

Ошибка:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ratings_average' in 'where clause' (SQL: select `products`.*, AVG(rating) as ratings_average from `products` left join `reviews` on `products`.`id` = `reviews`.`productID` where (`categoryID` in (9, 11, 31) and `productSellingPrice` between 50 and 5000 and `ratings_average` between 1 and 2) group by `products`.`id`) 
+0

Имеется ли в вашей таблице столбец с именем «rating_average»? – TZHX

+0

Я использую DB :: raw ('AVG (рейтинг) как rating_average' @TZHX –

+0

Итак, это «нет»? – TZHX

ответ

0

Вместо рейтинга массива вы можете найти $minRating и maxRating. От этих два значения, которое вы можете запустить запросе, как это:

$query->whereBetween('rating',[$minRating,$maxRtaing]); 
+0

его не работает –

+0

используйте этот '$ query-> whereBetween ('AVG (\' rating \ ')', $ ratingArray);' Не уверены, нужны ли обратные ссылки для значения AVG, но все остальное обращено на ваш вопрос. @ektasingh – Martin

+0

@ektasingh Я отредактировал свой ответ. Посмотрите, что это помогает или нет. – smartrahat

0

Проблемы проблема SQL, и это связанно с обзорным. Я не очень хорошо разбираюсь в API Laravel, но SQL-порождено (на основе ваших полезных сообщений об ошибках):

select `products`.*, AVG(rating) as ratings_average 
    from `products` left join `reviews` on `products`.`id` = `reviews`.`productID` 
    where (`categoryID` in (9, 11, 31) and `productSellingPrice` between 50 and 5000 
     and `ratings_average` between 1 and 2) group by `products`.`id`) 

Проблема заключается в том, что ratings_average вычисляемом столбце относится к GROUP BY области. Единственный способ ссылаться на этот столбец в заявлении HAVING. Ваш SQL оператор будет выглядеть следующим образом:

select `products`.*, AVG(`ratings`.`rating`) as ratings_average 
    where `products`.`id` = `reviews`.`productId` 
    group by `products`.`id` 
    having (`categoryID` in (9, 11, 31) and `productSellingPrice` between 50 and 5000 
     and `ratings_average` between 1 and 2) 

Технически говоря, первые два пункта в имеющей выше высказывании может быть в вашем предложении WHERE, но ratings_average имени столбца можно ссылаться только в пункте HAVING. И WHERE, и HAVING ограничивают ваши результаты, но HAVING оценивается после группировки.

+0

Как я могу решить свою проблему, если я использую то, что тогда я нашел ошибку в grammer.php, что strtolower() ожидает, что параметр 1 является строкой, заданный объект –

+0

Я не могу ответить на конкретный вопрос API, просто SQL, который должен быть генерироваться. Как я уже упоминал в своем ответе, я не очень разбираюсь в API laravel. –

Смежные вопросы