将mysql查询转换为雄辩的查询问题

时间:2018-04-20 05:35:01

标签: mysql laravel eloquent

我在mysql中构建了以下查询。并尝试了很多转换为laravel但没有成功。

SELECT u.id, u.purchase_item_name,u.sales_item_name, us.type,
GROUP_CONCAT(p.itemcode) AS purchase_items,
GROUP_CONCAT(s.itemcode) as sales_items 
FROM composite_inventories as u 
LEFT JOIN composite_has_inventories as us ON u.id = us.composite_inventory_id 
LEFT JOIN inventories as s ON US.inventory_id = s.id AND us.type='sale'
LEFT JOIN inventories as p ON US.inventory_id = p.id AND us.type='purchase'
GROUP BY u.id

我正在尝试上面查询laravel datatabel查询,但它给出了如下错误。

SQLSTATE [42000]:语法错误或访问冲突:1055' saas.composite_inventories.purchase_item_name'不在GROUP BY中(SQL:选择GROUP_CONCAT(p.itemcode)作为purchase_items,GROUP_CONCAT(s.itemcode)作为sales_items,composite_inventoriesidcomposite_inventories。{{ 1}},purchase_item_namecomposite_inventoriessales_item_nameus来自type,加入composite_inventories作为composite_has_inventories us } {。{1}} = composite_inventoriesid在[{1}} uscomposite_inventory_idinventories加入sUS = {{1} {。inventory_idsid ='在ustype inventories左右加入p。{{ 1}} = USinventory_idpid ='按us购买'分组type

我在laravel查询下尝试过。

composite_inventories

我刚试过下面的查询

id

以上查询在显示数据表时有效。但是当我尝试搜索过滤器时,它会给出以下错误,因为purchase_items和sales_items字段在数据库中不存在但只是别名。错误是

  

异常消息:↵↵SQLSTATE[42000]:语法错误或访问冲突:1583对本机函数的调用中的参数不正确' LOWER' (SQL:选择计数为聚合来自(选择$result = Compositeinventory::select([ DB::raw('GROUP_CONCAT(p.itemcode) as purchase_items'), DB::raw('GROUP_CONCAT(s.itemcode) as sales_items'), 'composite_inventories.id', 'composite_inventories.purchase_item_name', 'composite_inventories.sales_item_name', 'us.type' ])->leftJoin('composite_has_inventories as us', 'composite_inventories.id', '=', 'us.composite_inventory_id') ->leftJoin('inventories as s', function($join) { $join->on('US.inventory_id', '=', 's.id'); $join->on('us.type','=',DB::raw("'sale'")); }) ->leftJoin('inventories as p', function($join) { $join->on('US.inventory_id', '=', 'p.id'); $join->on('us.type','=',DB::raw("'purchase'")); }) ->groupBy('composite_inventories.id')->get(); $row = DB::table('composite_inventories as u')->select([ 'u.id', 'u.purchase_item_name', 'u.sales_item_name', DB::raw('GROUP_CONCAT(p.itemcode) as purchase_items'), DB::raw('GROUP_CONCAT(s.itemcode) as sales_items') ])->leftJoin('composite_has_inventories as us', 'u.id', '=', 'us.composite_inventory_id') ->leftJoin('inventories as s', function($join) { $join->on('US.inventory_id', '=', 's.id'); $join->on('us.type','=',DB::raw("'sale'")); }) ->leftJoin('inventories as p', function($join) { $join->on('US.inventory_id', '=', 'p.id'); $join->on('us.type','=',DB::raw("'purchase'")); }) ->groupBy('u.id', 'u.purchase_item_name','u.sales_item_name'); uidupurchase_item_name,GROUP_CONCAT(p。 itemcode)作为purchase_items,GROUP_CONCAT(s.itemcode)作为u的sales_items,sales_item_namecomposite_inventories作为u composite_has_inventories us u id。 = uscomposite_inventory_id在[{1}} inventories = sUSinventory_id左加入s idus ='促销'在[{1}} typeinventories pUS = {{1} }。inventory_idpid ='购买'其中(LOWER(ustype)LIKE%a%或LOWER (composite_inventoriesu.purchase_item_name)LIKE%a%或LOWER(composite_inventoriesu.purchase_items)LIKE%a%或LOWER(composite_inventoriesu.sales_item_namecomposite_inventories u.sales_itemsuidupurchase_item_name)count_row_table)

1 个答案:

答案 0 :(得分:3)

这不是laravel的问题,您的查询无效,因为它包含一些未聚合且未在group子句中提及的列。要更正此问题,您需要将group by子句更新为

group by u.id, u.purchase_item_name,u.sales_item_name, us.type

在查询构建器

->groupBy('composite_inventories.id', 'composite_inventories.purchase_item_name','composite_inventories.sales_item_name', 'composite_has_inventories.type')

如果每个composite_inventories有多个type(s),那么我猜你也需要GROUP_CONCAT,并从group by子句中删除这个列。

更新语法错误,您没有正确使用lower函数只需将要转换为值的列名称传递给小写,如

WHERE (
      LOWER(u.purchase_item_name) LIKE '% a %'
      OR LOWER(u.purchase_items) LIKE '% a %'
      OR LOWER(u.sales_item_name`) LIKE '% a %' 
      OR LOWER(u.sales_items) LIKE '% a %'
)

如果您的数据库排序规则未设置为区分大小写,则无需使用lower()功能获取更多信息,请查看B.5.4.1 Case Sensitivity in String Searches

此外,如果您在查询中使用mysql fucntions,则可能需要使用laravel的查询构建器的raw()方法

相关问题