many_many 关联分页查询不生效

数据库结构

post

–id

–name

tag

–id

–name

post_tag

–post_id

–tag_id

Post中的relation定义如下

‘tags’=>array(self::MANY_MANY, ‘Tag’, ‘post_tag(post_id, tag_id)’),

我现在想根据 tag的name查到对应的post,代码如下:




    $criteria = new CDbCriteria();

    $with = array(

    	'comments' => array()

    );

    if(isset($_GET['tag'])) {

    	$with['tags'] = array(

                'select'=>false,

                'joinType'=>'INNER JOIN',

                'condition'=>'tags.name="'.$_GET['tag'].'"',

	  	);

    }

    $count    = Post::model()->published()->with($with)->count($criteria);

    echo $count;

    $pages    = new CPagination($count);

    $pages->pageSize = 3 * 4;

    $pages->applyLimit($criteria);

    $Posts = Post::model()->published()->with($with)->findAll($criteria);



问题是:

查询出来的$count的个数是正确的,但是$posts不正确。

通过查看sql发现count的时候sql是:

SELECT COUNT(DISTINCT t.id) FROM post t LEFT OUTER

JOIN comment comments ON (comments.post_id=t.id) INNER JOIN

post_tag tags_tags ON (t.id=tags_tags.post_id) INNER JOIN

tag tags ON (tags.id=tags_tags.tag_id) WHERE (t.disabled=0

and public_time<‘2012-09-04 18:25:18’) AND (tags.name=“t2”)

而下面findAll生成的sql是:

SELECT t.id AS t0_c0, t.disabled AS t0_c1,

t.user_id AS t0_c2, t.path AS t0_c3, t.title AS t0_c4,

t.description AS t0_c5, t.meta_keywords AS t0_c6,

t.meta_description AS t0_c7, t.public_time AS t0_c8,

t.viewed AS t0_c9, t.favourite AS t0_c10, t.created AS

t0_c11, t.updated AS t0_c12 FROM post t WHERE (t.disabled=0

and public_time<‘2012-09-04 18:30:25’) ORDER BY public_time desc LIMIT 12;

SELECT t.id AS t0_c0 FROM post t INNER JOIN

group_tag tags_tags ON (t.id=tags_tags.post_id) INNER JOIN

tag tags ON (tags.id=tags_tags.tag_id) WHERE (t.id IN (19,

20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30)) AND (tags.name="t2")

继续分析之后发现,如果有了$pages->applyLimit($criteria)这句,sql就会被搞错,没有这句sql就是正确的,但是只要修改了$criteria的limit和offset,sql就会变成下面那个样子。

但是不applyLimit或者修改offset和limit就无法实现分页,求解。

这个好像找到办法了,用了->together()就可以了。