This is what I have done so far.
DB::table('products')
->leftjoin('inventories', 'inventories.product_id', 'products.id')
})
->leftjoin('order_items as purchase_oi', function($query){
$query->on('purchase_oi.inventory_id', 'inventories.id');
$query->on('purchase_oi.status','!=', \DB::raw('"cancelled"'));
})
->select(DB::raw('sum(inventories.quantity)as qty'),
DB::raw('count(purchase_oi.inventory_id) as purchases'),
'products.id as pid', 'products.*')
->where('products.is_deleted', 0)
->where('inventories.is_deleted',0)
->groupBy('inventories.product_id')
->get();
order_items table contains the status in
enum('shipped','return''cancelled');
This issue is here on the join with order_items table. Currently, I'm just getting the data which is not equal to cancelled but I want to get the order_items data which are returned and the order_items data which are cancelled. i.e get me the purchases,cancelled and return count from order_items table. Expected output is:
0=>purchases = 4,
returns = 10,
cancelled = 2
I think the problem is your groupBy()
. If you have the following query:
SELECT COUNT(*) AS count FROM table GROUP BY id
You don't end up with
+-------+
| count |
+-------+
| 5 |
+-------+
Instead you end up with:
+-------+
| count |
+-------+
| 1 |
+-------+
| 1 |
+-------+
| 1 |
+-------+
| 1 |
+-------+
| 1 |
+-------+
The count of all items per grouping.
Try this:
\DB::enableQueryLog();
\DB::flushQueryLog();
//Execute your query
$queries = /DB::getQueryLog();
/DB::disableQueryLog();
/DB::flushQueryLog();
$queries = collect($queries)->map(function (array $query) {
return array_only($query, ['query', 'bindings']);
})->toArray();
dd($queries);
This should tell you exactly what SQL is being executed.