php 一对多关系避免循环操纵数据库

在实际环境经常会遇到 一些一对多关系
比如 用户->订单 一个用户可能有多个订单

框架中有自带的模型关联可以实现 我来记一下不用模型关联的处理方式

一次查询多个用户 并且返回各自的订单记录
用循环查询的话不太合理 而且效率很低 这个时候可以用in条件加column()方法
例如

$ids =[1,2,3];//用户id数组
$ids_string = implode(',',$ids);
$order_list = Order::where([['id','in',$ids],['data_status','=',1]])->column('*','id');

$order_list查出的就是

以用户的id为key,以所有字段组成数组的值

的数组 这时候在循环赋值就可以

foreach($user_list as $k=>$v)
{
	$user_list[$k]['order'] = $order_list[$v['id']];
}

其次array_column()方法也可以用 返回输入数组中某个单一列的值。

array_column(array,column_key,index_key);
array 必需。规定要使用的多维数组(记录集)
column_key 必需。需要返回值的列。可以是索引数组的列的整数索引,或者是关联数组的列的字符串键值 该参数也可以是 NULL,此时将返回整个数组(配合 index_key 参数来重置数组键的时候,非常有用)
index_key 可选。用作返回数组的索引/键的列。

还有一种 我目的是查询三种情况下的订单数量 这样也可以避免循环操作数据库 但不知道对不对 姑且放着

UserModel::alias('u')
->field('u.*,count(ps.id) as ps_count,count(pse.id) as empty_count,count(psne.id) as not_empty_count')
->join('order o','o.uid=u.id','left')
->join('(SELECT id FROM `order` WHERE  `data_status` = 1  AND `status` = 0 ) pse','pse.id=o.id','left')
->join('(SELECT id FROM `order` WHERE  `data_status` = 1  AND `status` = 1 ) psne','psne.id=o.id','left')
->group('u.id')
->where($where)
->select()

你可能感兴趣的:(php,php)