关键词搜索

源码搜索 ×
×

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

发布2020-01-14浏览3702次

详情内容

优化建议:

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

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

 

例子:

原写法:

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

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

  1. $rsdo=Db::name('order')->field('id,number,pay_number,type')->where('user_id', $user_id)->where('state',0)->where('deleted',0)->select();
  2. if(!empty($rsdo)){
  3. $number_list = array_column($rsdo, 'number');
  4. $prs = Db::name('order_product')->field('id')->where('user_id', $user_id)->where('number',['in', $number_list])->column('id','number');
  5. $delete_order_ids = [];
  6. foreach($rsdo as $rsdel){
  7. //不存在就删除
  8. if(empty($prs[$rsdel['number']])){
  9. $delete_order_ids[] = $rsdel['id'];
  10. }
  11. }
  12. $delete_order_ids = array_unique($delete_order_ids);
  13. if(!empty($delete_order_ids)){
  14. Db::name('order')->where('id',['in', $delete_order_ids])->delete();
  15. }
  16. }

 

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载