【问题标题】:Custom Queries in laravel 5laravel 5 中的自定义查询
【发布时间】:2017-08-04 10:51:27
【问题描述】:

如何在 laravel 5.4 中运行这种类型的查询

     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::select('') 中尝试此操作时 它给了我一个错误:

SQLSTATE[42000]: 语法错误或访问冲突: 1055 'amsdb.purchases.region_id' 不在 GROUP BY 中(SQL: select items.id,items.name,total,region from items LEFT OUTER JOIN (选择 purchase.region_id 作为区域,sum(purchases_detail.quantity) 作为总计,purchases_detail.item_id 来自购买详情 离开加入购买(purchases.id=purchases_detail.purchase_id) GROUP BY purchase_detail.item_id) pd on (pd.item_id=items.id))

但是当我运行它 Phpmyadmin 时效果很好

【问题讨论】:

  • 你应该在 Laravel 中关闭 strict 并且一切都会正常运行。转到config/database.php并在mysql配置数组中,将strict => true更改为strict => false;)
  • @Maraboc 糟糕的建议,他应该修正他的查询。
  • @TimBiegeleisen 我认为即使他修复了查询,他也应该更新严格模式!
  • 感谢@Maraboc 它对我有用,但我想知道如何在 Laravel 语法中运行这种类型的查询。
  • @aihtshamali 在 MySQL 中关闭严格模式后,您无需在 Laravel 中做任何额外的事情。但是你应该真正修复你的查询逻辑,这样你就不需要这样做了。

标签: mysql laravel phpmyadmin query-builder laravel-query-builder


【解决方案1】:

正如错误消息告诉您的那样,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

【讨论】:

    【解决方案2】:

    不确定,但我认为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,因此您必须重复两次。

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 1970-01-01
      • 2018-01-12
      • 2015-10-21
      • 2015-05-26
      • 1970-01-01
      • 2022-12-29
      • 2018-01-11
      • 1970-01-01
      相关资源
      最近更新 更多