如何在Laravel原始表达式中进行LEFT OUTER JOIN

时间:2019-09-19 12:48:08

标签: laravel

此原始查询在两条注释行之间运行良好。

$q = DB::table('stock_items')
          ->selectRaw('stock_parts.title')
          ->selectRaw('COUNT(*) as qtyAvailable')
          ->selectRaw('SUM(shipments.item_cost) as totalValue')
          //->selectRaw('stock_alerts.minimum AS minimum')
          ->join('stock_parts', 'stock_items.stock_part_id', '=', 'stock_parts.id')
          ->join('shipments', 'shipments.id', '=', 'stock_items.shipment_id')
          //->leftJoin('stock_alerts', 'stock_alerts.stock_part_id', '=', 'stock_items.stock_part_id')
          ->whereNull('stock_items.status')
          ->where('stock_items.current_stock_id', '=', $stockId)
          ->groupBy('stock_parts.id')
          ->get();

需要注释行才能从另一个表中获取信息。

在原始SQL中,我使用的是LEFT OUTER JOIN

取消注释这些行会显示此错误:

SQLSTATE[42000]: Syntax error or access violation: 1055
Expression #4 of SELECT list is not in GROUP BY clause
and contains nonaggregated column 'rdphone-dev.stock_alerts.minimum'
which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by (SQL: select stock_parts.title, COUNT(*) as qtyAvailable, SUM(shipments.item_cost) as totalValue, stock_alerts.minimum AS minimum from `stock_items` inner join `stock_parts` on `stock_items`.`stock_part_id` = `stock_parts`.`id` inner join `shipments` on `shipments`.`id` = `stock_items`.`shipment_id` left join `stock_alerts` on `stock_alerts`.`stock_part_id` = `stock_items`.`stock_part_id` where `stock_items`.`status` is null and `stock_items`.`current_stock_id` = 1 group by `stock_parts`.`id`)",

在Laravel 5.6中进行LEFT OUTER JOIN的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

select中使用的每个字段都必须包含在分组依据中,我在groupBy中添加了最小列。

$q = DB::table('stock_items')
          ->selectRaw('stock_parts.title')
          ->selectRaw('COUNT(*) as qtyAvailable')
          ->selectRaw('SUM(shipments.item_cost) as totalValue')
          ->selectRaw('stock_alerts.minimum AS minimum')
          ->join('stock_parts', 'stock_items.stock_part_id', '=', 'stock_parts.id')
          ->join('shipments', 'shipments.id', '=', 'stock_items.shipment_id')
          ->leftJoin('stock_alerts', 'stock_alerts.stock_part_id', '=', 'stock_items.stock_part_id')
          ->whereNull('stock_items.status')
          ->where('stock_items.current_stock_id', '=', $stockId)
          ->groupBy('stock_parts.id', 'minimum')
          ->get();