简体   繁体   中英

How to use CDbCriteria in Yii to apply SQL filters on Model

I try to get this mysql query to work with Yii model but i can't.

SELECT COUNT( qhc.countries_id) AS counter, q.question, co.name 
FROM questions AS q , countries as co, questions_has_countries AS qhc
WHERE qhc.questions_id = q.id 
AND co.id = qhc.countries_id
GROUP BY question
HAVING counter = 2

So far i have this, but somehow thou it seems ok, it doesnt work :

$criteria = new CDbCriteria(); 
$criteria->select = 'question, COUNT(countries_id) as counter';
$criteria->with = array('countries', 'categories');
$criteria->addInCondition('countries.id' , $_POST['Questions']['countries']);
$criteria->group = 'question';
$criteria->having = ('counter = 1');
$model = Questions::model()->findAll($criteria)

Pls help, I'am pretty new to Yii framework.

Thanks.

Sql from the log :

SELECT `t`.`question` AS `t0_c1`,
COUNT(countries_id) as counter, `t`.`id` AS `t0_c0`, `countries`.`id` AS
`t1_c0`, `countries`.`name` AS `t1_c1`, `categories`.`id` AS `t2_c0`,
`categories`.`name` AS `t2_c1` FROM `questions` `t`  LEFT OUTER JOIN
`questions_has_countries` `countries_countries` ON
(`t`.`id`=`countries_countries`.`questions_id`) LEFT OUTER JOIN `countries`
`countries` ON (`countries`.`id`=`countries_countries`.`countries_id`) 
LEFT OUTER JOIN `questions_has_categories` `categories_categories` ON
(`t`.`id`=`categories_categories`.`questions_id`) LEFT OUTER JOIN
`categories` `categories` ON
(`categories`.`id`=`categories_categories`.`categories_id`)  WHERE
(countries.id=:ycp0) GROUP BY question HAVING (counter = 2). Bound with
:ycp0='1'

You have done most of work. Now you need to call the $criteria into model. Just like this

$rows = MODEL ::model()->findAll($criteria);

Where MODEL is model class of table which you want to apply criteria on.

To learn more about this you can follow this CActiveRecord Class .

Try to set together in CDbCriteria

...
$criteria->together = true;
$model = Question::model()->findAll($criteria);

when you use "as counter", your model must have a property named "counter" or it will not load it into your model.

if you don't have a property named "counter", try using another one of your models property that you are not selecting right now : "as someColumn"

and use condition or addCondition or .. instead of having

cheers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM