I have a CActiveDataProvider object for pagination with a ON clause that adds conditions.
The pagination says ‘1 article found’ but $dataProvider->getData() returns all of them.
model Article.php
/**
* @return array relational rules.
*/
public function relations()
{
return array(
'categories'=>array(self::MANY_MANY, 'CategorieArticle', 'article_categorie(article_id, categorie_id)'),
}
model CategorieArticle.php
/**
* @return array relational rules.
*/
public function relations()
{
return array(
'articles'=>array(self::MANY_MANY, 'Article', 'article_categorie(categorie_id, article_id)'),
);
}
model ArticleCategorie.php
public function relations()
{
return array(
'article' => array(self::BELONGS_TO, 'Article', 'article_id'),
'categorie' => array(self::BELONGS_TO, 'CategorieArticle', 'categorie_id'),
);
}
$dataProvider=new CActiveDataProvider('Article', array(
'criteria'=>array(
'condition'=>'t.is_active=1',
'with'=>array(
'categories' => array(
'on'=>"categories.is_active = 1 AND categories.id = ".$categories_id,
'joinType' => 'INNER JOIN',
'order' => 'categories.position ASC',
)
),
),
'pagination'=>array(
'pageSize'=>10,
),
));
Yii log :
SELECT * FROM `article` `t` INNER JOIN
`article_categorie` `categories_categories` ON
(`t`.`id`=`categories_categories`.`article_id`) INNER JOIN
`categorie_article` `categories` ON
(`categories`.`id`=`categories_categories`.`categorie_id`) AND
(categories.is_active = 1 AND categories.id = 4) WHERE (`t`.`id`=1)
ORDER BY categories.position ASC
returns 1 article
SELECT COUNT(DISTINCT `t`.`id`) FROM `article` `t` INNER
JOIN `article_categorie` `categories_categories` ON
(`t`.`id`=`categories_categories`.`article_id`) INNER JOIN
`categorie_article` `categories` ON
(`categories`.`id`=`categories_categories`.`categorie_id`) AND
(categories.is_active = 1 AND categories.id = 4) WHERE (t.is_active=1)
returns 1 article
Both sql requests are fine. So what’s going on with CActiveDataProvider. Why does it return all the articles ?
Does it hate the (categories.is_active = 1 AND categories.id = 4) ON clause ?
$data = $dataProvider->getData();
echo count($data); // count = 2 (2 articles in database)
echo $dataProvider->getTotalItemCount() . ' article'; // '1 article'
<div id="products-inner">
<?php foreach($data as $article)
$this->renderPartial('/article/_preview', array('categorie'=>$categorie, 'article'=>$article, 'cat_breadcrumb'=>$cat_breadcrumb));
?>
</div>