tp5 foreach 套循环的优化(就是foreach 里边再查表)

优化建议:

1.不要foreach里边再查询表,因为循环多次查表会很占资源的

tp5 foreach 套循环的优化(就是foreach 里边再查表)_第1张图片

2.没有办法就关联表查询join

 

例子:

原写法:

				$rsdo=Db::name('order')->field('id,number,pay_number,type')->where('user_id', $user_id)->where('state',0)->where('deleted',0)->select();
				if(!empty($rsdo)){
					foreach($rsdo as $rsdel){
						//查询order_product中有没有相应number的商品,如果没有就删除订单记录
						$prs=Db::name('order_product')->field('id')->where('user_id', $user_id)->where('number',$rsdel['number'])->find();
						if(!$prs['id']){//不存在就删除
							Db::name('order')->where('id',$rsdel['id'])->delete();
						}
					}
				}

优化语句:(没有实测,大概意思)

$rsdo=Db::name('order')->field('id,number,pay_number,type')->where('user_id', $user_id)->where('state',0)->where('deleted',0)->select();
if(!empty($rsdo)){
    $number_list = array_column($rsdo, 'number');
    $prs = Db::name('order_product')->field('id')->where('user_id', $user_id)->where('number',['in', $number_list])->column('id','number');
    $delete_order_ids = [];
    foreach($rsdo as $rsdel){
        //不存在就删除
        if(empty($prs[$rsdel['number']])){
            $delete_order_ids[] = $rsdel['id'];
        }
    }
    $delete_order_ids = array_unique($delete_order_ids);
    if(!empty($delete_order_ids)){
        Db::name('order')->where('id',['in', $delete_order_ids])->delete();
    }
}

 

 

你可能感兴趣的:(thinkphp5,MY,SQL)