tp5 foreach 套循環的優化(就是foreach 裏邊再查表)

優化建議:

1.不要foreach裏邊再查詢表,因爲循環多次查表會很佔資源的

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();
    }
}

 

 

發佈了1170 篇原創文章 · 獲贊 288 · 訪問量 459萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章