So i have 2 tables. Orders
and OrderItems
. Relationship is each Order can have many OrderItems (orderitem is just a product).
OrderItem Table
id INT PRIMARY KEY
name TEXT
quantity INT
pack_value INT
order_id INT FOREIGN KEY REFERENCES ORDER_ID ON ORDERS TABLE
product_id INT FOREIGN KEY REFERENCES PRODUCT_ID ON PRODUCTS TABLE
Orders Table
order_id INT PRIMARY KEY
status TEXT
user_id INT FOREIGN KEY REFERENCES USER_ID ON USERS TABLE
An order can have the same OrderItem twice or only once. For example like below, 3 items but 2 products:
OrderItem(id=1, product_id=100, name="Pizza", quantity=2, pack_value=10, order_id=7)
OrderItem(id=2, product_id=100, name="Pizza", quantity=10, pack_value=1, order_id=7)
OrderItem(id=3, product_id=555, name="Olives", quantity=5, pack_value=1, order_id=7)
So above there is 2 entries for Pizza
and this is the result i get. However i want it to only show 1 entry for Pizza
because its the same item. Below is what i want to see:
OrderItem(product_id=100, name="Pizza", quantity=30, pack_value=1, order_id=7)
OrderItem(product_id=555, name="Olives", quantity=5, pack_value=1, order_id=7)
So essentially, if the item only exists once, then do nothing to it. If it exists twice, then make the pack_value=1
and the quantity is the sum of the individual quantity*pack_value
. So in example above quantity becomes (2*10 + 10*1 = 30)
.
The controller method is like below, and so here is where I want to do this:
public function showOrderDetails(Order $order){
return view('orders.show', compact('order'));
}
Also the Order
and OrderItem
models has the method for the relationships. For example, in the Order Model i have:
public function orderItems(){
return $this->hasMany(OrderItem::class, 'order_id');
}
Thanks, and if you need any extra info i can provide.
Advertisement
Answer
SELECT name,
SUM(quantity * pack_value) AS quantity,
1 AS pack_value,
order_id
FROM order_items
GROUP BY name,
order_id;
Merge another tables to this code using it as subquery, or add them into FROM clause (adjusting its output list and grouping expression) if needed.