I have a query and I tried to convert it to laravel query builder style. However I couldn't succeed.
This is my query
SELECT
count(*)
FILTER (WHERE order_status_id IN (5, 4, 15)) AS ready_for_delivery,
count(*)
FILTER (WHERE order_status_id IN (6)) AS out_for_delivery,
count(*)
FILTER (WHERE order_status_id IN (4, 10, 9, 12, 7)) AS completed_order,
count(*)
FILTER (WHERE order_status_id IN (11, 16, 17, 13)) AS waiting_for_cancellation_return_change
FROM order_item_histories;
This is what I got from http://www.midnightcowboycoder.com/ which obviously doesn't work. But it is a starting point
DB::table('order_item_histories')
->selectSub('count', 'ready_for_delivery')
->selectSub('FILTER', 'ready_for_delivery')
->selectSub('count', 'out_for_delivery')
->selectSub('FILTER', 'out_for_delivery')
->selectSub('count', 'completed_order')
->selectSub('FILTER', 'completed_order')
->selectSub('count', 'waiting_for_cancellation_return_change')
->selectSub('FILTER', 'waiting_for_cancellation_return_change')
->get();
This query works but it is just raw. I know no harm but..
$aa = DB::table('order_item_histories')
->select(DB::raw('count(*)
FILTER (WHERE order_status_id IN (5, 4, 15)) AS ready_for_delivery,
count(*)
FILTER (WHERE order_status_id IN (6)) AS out_for_delivery,
count(*)
FILTER (WHERE order_status_id IN (4, 10, 9, 12, 7)) AS completed_order,
count(*)
FILTER (WHERE order_status_id IN (11, 16, 17, 13)) AS waiting_for_cancellation_return_change'))
->get();
->selectSub('count(*) FILTER (WHERE order_status_id IN (5, 4, 15))', 'ready_for_delivery')but it's perfectly fine to write raw queries is this case, just beware of SQL injection