模型连贯操作的重用

浏览:608 发布日期:2015/11/09 分类:技术分享 关键字: 模型 连贯操作 对象复制
最近在做产品的分类查询,其中还用到分页查询。于是把链式SQL查询提取出来,可以方便地用于分页和数据显示$joinTable = 'reserve';
$where = "reserve.size>'45'";
$productM = M('product');
$tempSQL = $productM->alias('p')
    ->field('p.ProductId,p.name,p.mainPic,p.priceN,p.priceVIP,p.isNew,p.isHot,p.sales,p.salesF')
    ->join("$joinTable ON $joinTable.ProductId = p.ProductId")
    ->distinct(true)
    ->where( $where )
    ->order('salesF DESC');
$count = $tempSQL->count();        // 查询满足要求的总记录数$Page = new \Think\Page($count,$countPerPage);
$list = $tempSQL->page($nowPage.','.$Page->listRows)->select();        //查询结果集    
但却发现,查询出来的结果集并非是经过筛选的,而是全部的产品列表。而把前面的$count = $tempSQL->count(); 注释掉时,查询出来的结果就是经过筛选的。可以看得出来 $tempSQL 在被使用了一次之后就被复原了。查看TP3.2的用户手册“连贯操作”那一章可以看到有下面这一句:
连贯操作通常只有一个参数,并且仅在当此查询或者操作有效,完成后会自动清空连贯操作的所有传值(有个别特殊的连贯操作有多个参数,并且会记录当前的传值)。简而言之,连贯操作的结果不会带入以后的查询。

所以解决方案就是把$tempSQL这个对象复制一份,$tempSQL2 = clone $tempSQL;
$count = $tempSQL->count();
$Page = new \Think\Page($count,$countPerPage);
$list = $tempSQL2->page($nowPage.','.$Page->listRows)->select();
最佳答案
评论( 相关
后面还有条评论,点击查看>>