優化建議:
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();
}
}