Laravel 数据库 聚合+Join 查找语句 学习笔记

9 篇文章 0 订阅

在利用laravel处理数据库数据的时候 简单的聚合可以直接实现:

 

聚合#

 

查询构造器也提供各式各样的聚合方法,如 countmaxminavg 及 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 方法:

比如:1、

$cost_list = DB::table('order')->leftJoin('plan', 'order.plan_id', '=', 'plan.id')->where($where)->first(
            [
                \DB::raw('SUM(fish_cost) as fish_cost'),
                \DB::raw('SUM(platform_cost) as platform_cost'),
                \DB::raw('SUM(local_cost) as local_cost')
            ]
        );

 

2、

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

3、

	/**
	* sales deb export.
	*
	* @param
	* @return .csv
	*
	*/
	private function _salesDEBExport()
	{
		$objects = DB::table('orders')
					->join('order_products','orders.id','=','order_products.order_id')
					->join('products','order_products.product_id','=','products.id')
					->leftJoin('categories','products.category_id','=','categories.id')
 
					->select(
						'orders.external_id',
						'orders.address_billing_name',
						'categories.customs_code',
						'orders.external_sale_date',
						'orders.invoice_external_id',
						'orders.payment_method',
						'orders.address_shipping_country',
						DB::raw('
							SUM(order_products.amount_base) AS amount_base,
							SUM(order_products.amount_tax) AS amount_tax,
							SUM(order_products.amount_total) AS amount_total
							')
						)
					->groupBy('orders.external_id','categories.customs_code')
					->whereIn('orders.object_state_id', array(2,3))
					->where('orders.created_at', 'like', Input::get('year') . '-' . Input::get('month') . '-%')
					->get();
 
		if (empty($objects))
		{
			Notification::error("Aucune donnée disponible.");
			return Redirect::to(URL::previous());
		}else{			
			$headers = array(
				'Content-Type' 		 => 'text/csv',
				'Content-Disposition' => 'attachment; filename="sales_deb_export_'.Input::get('month').'_'.Input::get('year').'.csv"',
				);
 
			$output = rtrim(implode(',', array_keys((array) $objects[0]))) . "\n";
			foreach($objects as $object)
			{
				$output .= rtrim(implode(',', (array) $object)) . "\n";
			}
			return Response::make($output, 200, $headers);
 
		}
 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值