0

我怎么能在laravel 5.4自定义查询在laravel 5

 select items.id,items.name,total,region from items LEFT OUTER JOIN 
    (select purchases.region_id as region , sum(purchases_detail.quantity) 
    as total,purchases_detail.item_id 
    from purchases_detail 
    left join purchases on(purchases.id=purchases_detail.purchase_id) 
    GROUP BY purchases_detail.item_id) pd on (pd.item_id=items.id) 

运行此类型的查询时,我想这在DB ::选择( '') 它给了我一个错误:

SQLSTATE [42000]:语法错误或访问冲突:1055'amsdb.purchases.region_id'不在GROUP BY中(SQL:select items.id,items.name,total,来自项目的区域LEFT OUTER JOIN (select purchases.region_id as region,sum(purchases_detail.quantity)as total,purchases_detail.item_id f ROM purchases_detail 左连接上(pd.item_id = items.id))

上(purchases.id = purchases_detail.purchase_id) GROUP BY purchases_detail.item_id)PD购买,但它工作得很好,当我运行它的phpmyadmin

+1

你应该在Laravel中关闭strict,并且所有东西都会按照它的样子工作。进入'config/database.php'并在mysql配置数组中,将'strict => true'改为'strict => false'; – Maraboc

+0

@Maraboc不好的建议,他应该修复他的查询。 –

+0

@TimBiegeleisen Ithink即使他修复了查询,他应该更新严格模式! – Maraboc

回答

0

由于错误消息告诉您,purchases.region_id列不会显示为聚合,您也不会按它进行分组。快速的解决办法是刚刚从内部和外部查询中删除此列:

SELECT 
    items.id, 
    items.name, 
    pd.total 
FROM items 
LEFT JOIN 
(
    SELECT 
     t1.item_id, 
     SUM(t1.quantity) AS total 
    FROM purchases_detail t1 
    LEFT JOIN purchases t2 
     ON t2.id = t1.purchase_id 
    GROUP BY t1.item_id 
) pd 
    ON pd.item_id = items.id 
0

不知道,但我认为select()方法不能包含所有的SQL查询。

我不知道它是否会工作,但试试这个。它使用了许多查询生成器功能:

$subQuery = DB::table('purchases_detail') 
    ->select(DB::raw('purchases.region_id as region , sum(purchases_detail.quantity) 
    as total,purchases_detail.item_id')) 
    ->leftJoin('purchases', 'purchases.id', '=', 'purchases_detail.purchase_id') 
    ->groupBy('purchases_detail.item_id') 
    ->toSql(); 

$result = DB::table('items') 
    ->select('items.id', 'items.name', 'total,region') 
    ->leftJoin($subQuery . ' pd', 'pd.item_id', '=', 'items.id') // if not working, try ->leftJoin(DB::raw($subQuery) . ' pd', 'pd.item_id', '=', 'items.id') 
    ->get(); 

因为你的查询有一个嵌套SELECT,你必须让它在两次。