Laravel 数据库 聚合+Join 查找语句。

聚合#

查询构造器也提供各式各样的聚合方法,如 count, max, min, avg 及 sum。

使用聚合方法#

$users = DB::table('users')->count();

$price = DB::table('orders')->max('price');

$price = DB::table('orders')->min('price');

$price = DB::table('orders')->avg('price');

$total = DB::table('users')->sum('votes');

但是对于复杂的情况(比如join 后的结果,其结果并不是个objet)。就不能直接使用上述的方法

解决方法:

db::raw('')

Raw Expressions#

有些时候您需要使用 raw expression 在查询语句里,这样的表达式会成为字串插入至查询中,因此要小心勿建立任何 SQL 注入的攻击点。要建立 raw expression,您可以使用 DB::raw 方法:

使用 Raw Expression#

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

实际代码:

  1. /** 
  2. * sales deb export. 
  3. * 
  4. * @param 
  5. * @return .csv 
  6. * 
  7. */  
  8. private function _salesDEBExport()  
  9. {  
  10.     $objects = DB::table('orders')  
  11.                 ->join('order_products','orders.id','=','order_products.order_id')  
  12.                 ->join('products','order_products.product_id','=','products.id')  
  13.                 ->leftJoin('categories','products.category_id','=','categories.id')  
  14.   
  15.                 ->select(  
  16.                     'orders.external_id',  
  17.                     'orders.address_billing_name',  
  18.                     'categories.customs_code',  
  19.                     'orders.external_sale_date',  
  20.                     'orders.invoice_external_id',  
  21.                     'orders.payment_method',  
  22.                     'orders.address_shipping_country',  
  23.                     DB::raw('  
  24.                         SUM(order_products.amount_base) AS amount_base,  
  25.                         SUM(order_products.amount_tax) AS amount_tax,  
  26.                         SUM(order_products.amount_total) AS amount_total  
  27.                         ')  
  28.                     )  
  29.                 ->groupBy('orders.external_id','categories.customs_code')  
  30.                 ->whereIn('orders.object_state_id', array(2,3))  
  31.                 ->where('orders.created_at', 'like', Input::get('year') . '-' . Input::get('month') . '-%')  
  32.                 ->get();  
  33.   
  34.     if (empty($objects))  
  35.     {  
  36.         Notification::error("Aucune donnée disponible.");  
  37.         return Redirect::to(URL::previous());  
  38.     }else{            
  39.         $headers = array(  
  40.             'Content-Type'       => 'text/csv',  
  41.             'Content-Disposition' => 'attachment; filename="sales_deb_export_'.Input::get('month').'_'.Input::get('year').'.csv"',  
  42.             );  
  43.   
  44.         $output = rtrim(implode(',', array_keys((array) $objects[0]))) . "\n";  
  45.         foreach($objects as $object)  
  46.         {  
  47.             $output .= rtrim(implode(',', (array) $object)) . "\n";  
  48.         }  
  49.         return Response::make($output, 200, $headers);  
  50.   
  51.     } 
posted @ 2017-08-20 21:52  南风丨知我意  阅读(4777)  评论(0)    收藏  举报