优化建议:
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();
}
}