2015-01-17 1 views
1

Я пытаюсь перевести следующий MySQL-запрос в Laravel Query Builder. Может ли кто-нибудь предложить, как это сделать?Невозможно перевести MySQL-запрос в Laravel Query Builder

SELECT 
orders.id AS order_id, 
COUNT(products.id) AS count 
FROM 
order_product 
LEFT JOIN orders ON orders.id = order_product.order_id 
LEFT JOIN products ON order_product.product_id = products.id 
WHERE 
orders.user_id = 2 
GROUP BY 
orders.id 

Вот мой текущий код:

public static function getProductsCount($userId = null) 
{ 
    if (!is_numeric($userId)) { 
     return false; 
    } 
    DB::table('order_product') 
     ->join('orders', 'orders.id', '=', 'order_product.order_id') 
     ->join('products', 'order_product.product_id', '=', 'products.id') 
     #->select('orders.id AS orders_id') 
     ->where('orders.user_id', '=', $userId) 
     ->distinct('products.id') 
     ->groupBy('orders.id') 
     ->count('products.id'); 
} 

В отличие от запроса я хочу выполнить, я получаю следующее:

select count(distinct `products`.`id`) as aggregate from `order_product` inner join `orders` on `orders`.`id` = `order_product`.`order_id` inner join `products` on `order_product`.`product_id` = `products`.`id` where `orders`.`user_id` = ? group by `orders`.`id` 

Любые идеи?

+0

Если все остальное не удается, вы можете просто использовать необработанный запрос. Ничто не указывает, что вам нужно использовать построитель запросов. –

+0

Верно, но я предпочитаю использовать Query Builder (для него SQL Injection protection и потому, что я хочу понять). – atwright147

+3

Вы используете -> join вместо -> leftJoin в своем освещенном запросе – baao

ответ

1

Метод count временно переопределяет указанные select столбцы, поскольку он выполняет агрегатную функцию в базе данных. Чтобы этого избежать, вы можете просто использовать select, как он определен в вашем запросе. Также, как отметил @michael в комментарии, вы должны использовать leftJoin вместо join. Ниже вы получите точный запрос, который вы отправили:

DB::table('order_product') 
     ->leftJoin('orders', 'orders.id', '=', 'order_product.order_id') 
     ->leftJoin('products', 'order_product.product_id', '=', 'products.id') 
     ->select('orders.id AS orders_id', 'COUNT(products.id) AS count') 
     ->where('orders.user_id', '=', $userId) 
     ->groupBy('orders.id') 
     ->get();