关注迅速公众平台
关注微信联系人
企业电话:021-64391578
tp5 使用paginate分页获取数据对象之后 如何对对象进行数据添加
大家都知道,在使用tp5的paginate获取分页数据之后,得到的是一个数据对象,但有时会碰到要对数据对象进行二次加工的情况,下面是解决此类问题的方法
1、直接在查询语句中利用MySQL函数
举例一:
1、将获取到的图片由相对地址拼接上域名,形成绝对地址
1 $yu = YU(); 2 return $this->field('orderid,productid,attrid,concat("'.$yu.'", logo) logo,title') 3 ->where(['orderid'=>$OrderId])->paginate(10);
2、将时间戳转换成所需要的日期格式
1 return $this->where($where)->with('user') 2 ->field("*,FROM_UNIXTIME(createtime,'%Y-%m-%d') createtime") 3 ->order('createtime desc') 4 ->select();
关于时间戳与日期转换,请参考MySQL时间戳与日期互相转换
举例二:每个商品有不同的规格数据,统计每个商品所有规格的总库存
1 $products = Db::name('product p') 2 ->field('itemid,name,m_price,price,logo,sale_num,sort,is_sale,is_floor,addtime,update_time') 3 ->field('(select sum(stock) from xf_product_attr a where a.product_id = p.itemid) stock_all') 4 ->whereOr($keywordComplex) 5 ->where($where) 6 ->order('itemid asc list_order asc') 7 ->paginate(10,false,[ 8 'query'=>[ 9 'keyword' =>$keyword, 10 'is_sale' =>$is_sale, 11 'is_floor' =>$is_floor, 12 'category' =>$category, 13 ] 14 ]);
举例三:获得某种商品券的兑换总数,使用左连接
1 return $this->with('shop') 2 ->alias('p') 3 ->join('order o','p.itemid = o.pro_id and o.status=2','left') 4 ->whereOr($whereOr) 5 ->where($where) 6 ->field('p.itemid,p.name,p.title,p.avatar,p.point,p.status,p.addtime,p.list_order, p.shop_id,p.check_status,count(*)') 7 ->order('p.addtime desc') 8 ->paginate(10,false,$query);
可以看到生成的sql的语句是
1 [ SQL ] SELECT p.itemid,p.name,p.title,p.avatar,p.point,p.status,p.addtime,p.list_order, p.shop_id,p.check_status,count(*) FROM `xf_product` `p` 2 LEFT JOIN `xf_order` `o` ON `p`.`itemid`=o.pro_id and o.status=2 ORDER BY `p`.`addtime` DESC LIMIT 0,10 [ RunTime:0.000000s ]
也可使用子查询,不过效率就下来了
1 return $this->with('shop') 2 ->alias('p') 3 ->whereOr($whereOr) 4 ->where($where) 5 ->field('*,(select count(*) from xf_order o where o.pro_id = p.itemid and o.status = 2)') 6 ->order('p.addtime desc') 7 ->paginate(10,false,$query);
生成的sql是这样的:
1 [ SQL ] SELECT *,(select count(*) from xf_order o where o.pro_id = p.itemid and o.status = 2) 2 FROM `xf_product` `p` ORDER BY `p`.`addtime` DESC LIMIT 0,10 [ RunTime:0.014000s ]
2、还有一些复杂的,通过MySQL自带函数是实现不了的,此时可以将对象转换为数组,然后再处理
1 } else { 2 $products = Db::name('product p') 3 ->field('itemid,name,m_price,price,logo,sale_num,sort,is_sale,is_floor,addtime,update_time') 4 ->whereOr($keywordComplex) 5 ->where($where) 6 ->order('itemid asc list_order asc') 7 ->paginate(10,false,[ 8 'query'=>[ 9 'keyword' =>$keyword, 10 'is_sale' =>$is_sale, 11 'is_floor' =>$is_floor, 12 'category' =>$category, 13 ] 14 ]); 15 } 16 17 //查找商品自身的类别 18 $products->toArray(); 19 foreach($products as $k=>$v){ 20 $data = $v; 21 $data['category_id'] = Db::name('product_category_bind pb') 22 ->view('category pc','id,name','pb.category_id = pc.id','left') 23 ->where(['pb.product_id'=>$v['itemid']]) 24 ->select()->toArray(); 25 $products->offsetSet($k,$data); 26 }
特别申明:本站的主旨在于收集互联网运营相关的干货知识,给运营小伙伴提供便利。 网站所收集到的公开内容均来自于互联网或用户投稿,并不代表本站认同其观点, 也不对网站内容的真实性负责,如有侵权,请联系站长删除
您可以联系我们
彼此协助, 彼此信任
方能将美好的蓝图兑现