tp5 使用paginate分頁獲取數據對象之后 如何對對象進行數據添加


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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM