For that I'd use as is, see these links
https://laracasts.com/discuss/channels/eloquent/writing-all-queries-directly-vs-model-relations
Hello, I need help on how to convert this SQL query with subquery inside inner join to Query builder. I'm new to this query builder. Hope you can help me convert this to query builder.
SELECT DISTINCT CONCAT(u.last_name, ", ", u.first_name ) AS full_name, ci.created_at AS date_purchase
FROM cart_items AS ci
LEFT JOIN products AS p ON ci.product_id = p.id
LEFT JOIN carts AS c ON ci.cart_id = c.id
LEFT JOIN `status` AS s ON ci.status_id = s.id
INNER JOIN users AS u ON c.user_id = u.id
INNER JOIN school_users AS su ON u.id = su.user_id
INNER JOIN
(
SELECT MAX(created_at) AS created_at1, cart_id
FROM cart_items
GROUP BY `cart_id`
)p2 ON ci.cart_id = p2.cart_id AND ci.created_at = p2.created_at1
WHERE p.product_type_id = 1 AND p.service_sub_type_id = 2 AND su.school_id = 57 AND ci.status_id = 2 OR ci.status_id = 3
ORDER BY ci.created_at DESC
I wouldn't bother. It will take a lot longer to come up with something that works, you'd be using a lot of RAW statements anyway since the query builder doesn't have a lot of that built in, and it would be a lot more code. I'd just use straight queries for the complex stuff with pdo bindings (always use bindings).
$bindings = [
'product_type_id' => 1,
'service_sub_type_id' => 2,
'school_id' => 57,
'status_id1' => 2,
'status_id2' => 3
];
$users = DB::select('SELECT DISTINCT CONCAT(u.last_name, ", ", u.first_name ) AS full_name, ci.created_at AS date_purchase
FROM cart_items AS ci
LEFT JOIN products AS p ON ci.product_id = p.id
LEFT JOIN carts AS c ON ci.cart_id = c.id
LEFT JOIN `status` AS s ON ci.status_id = s.id
INNER JOIN users AS u ON c.user_id = u.id
INNER JOIN school_users AS su ON u.id = su.user_id
INNER JOIN
(
SELECT MAX(created_at) AS created_at1, cart_id
FROM cart_items
GROUP BY `cart_id`
)p2 ON ci.cart_id = p2.cart_id AND ci.created_at = p2.created_at1
WHERE p.product_type_id = :product_type_id AND p.service_sub_type_id = :service_sub_type_id AND su.school_id = :school_id AND ci.status_id = :status_id1 OR ci.status_id = :status_id2
ORDER BY ci.created_at DESC', $bindings);
Please or to participate in this conversation.