Кажется, не удается перевести запрос 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`

Любые идеи?


person atwright147    schedule 17.01.2015    source источник
comment
Если ничего не помогает, вы можете просто использовать необработанный запрос. Ничто не говорит о том, что вам нужно использовать построитель запросов.   -  person Deniz Zoeteman    schedule 17.01.2015
comment
Верно, но я предпочитаю использовать Query Builder (для защиты от SQL-инъекций и потому, что я хочу понять).   -  person atwright147    schedule 17.01.2015
comment
вы используете -›join вместо -›leftJoin в вашем запросе на освещение   -  person baao    schedule 17.01.2015
comment
@Майкл совершенно прав. Я исправил это, и это помогло.   -  person atwright147    schedule 18.01.2015


Ответы (1)


Метод count временно переопределяет указанные столбцы 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();
person Bogdan    schedule 17.01.2015