RTJ
(Jenea Njs)
1
Hi all,
I am new in Yii.
And I found a problem, CDbCriteria skips the first conditions only works the order.
It is very probably that I’m just not using “condition” correctly.
Could someone tell me what I have wrong?
Thank you very much in advance.
public function actionIndex($c=null,$p=null,$o=null)
{
$criteria=new CDbCriteria();
if (isset($c)){
$criteria->condition='categoria=:categoria';
$criteria->params=array(':categoria'=>$c);
}
if (isset($p)){
$criteria->condition='provincia=:provincia';
$criteria->params=array(':provincia'=>$p);
}
$criteria->condition='activa=:activa';
$criteria->params=array(':activa'=>1);
if (isset($o) and $o==1){
$criteria->order = "preciodesde ASC";
}
if (isset($o) and $o==2){
$criteria->order = "preciodesde DESC";
}
if (isset($o) and $o==3){
$criteria->order = "vip ASC";
$criteria->order = "vip_precio DESC";
$criteria->condition='vip=:vip';
$criteria->params=array(':vip'=>1);
}
$count=Empresa::model()->count($criteria);
$pages=new CPagination($count);
// results per page
$pages->pageSize=10;
$pages->applyLimit($criteria);
softark
(Softark)
2
Hi RTJ,
If you use CDbCriteria::condition, it will totally replace the existing conditions with a new condition.
So you have to use CDbCriteria::addCondition() function instead.
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#addCondition-detail
And also you have to combine the order clause into one line.
public function actionIndex($c=null, $p=null, $o=null)
{
$criteria=new CDbCriteria();
if (isset($c)){
$criteria->addCondition('categoria=:categoria', 'AND');
$criteria->params[':categoria'] = $c;
}
if (isset($p)){
$criteria->addCondition('provincia=:provincia', 'AND');
$criteria->params[':provincia'] = $p;
}
$criteria->addCondition('activa=:activa');
$criteria->params[':activa'] = 1;
if (isset($o)){
if ($o==1){
$criteria->order = "preciodesde ASC";
}
else if ($o==2){
$criteria->order = "preciodesde DESC";
}
else if ($o==3){
$criteria->order = "vip ASC, vip_precio DESC";
$criteria->condition('vip=:vip', 'AND');
$criteria->params[':vip'] = 1;
}
}
...
Or, I would rather use CDbCriteria::compare() to write like this:
public function actionIndex($c, $p, $o=null)
{
$criteria=new CDbCriteria();
$criteria->compare('categoria', $c);
$criteria->compare('provincia', $p);
$criteria->compare('activa', 1);
if (isset($o)) {
if ($o==1) {
$criteria->order = "preciodesde ASC";
} else if ($o==2) {
$criteria->order = "preciodesde DESC";
} else if ($o==3) {
$criteria->order = "vip ASC, vip_precio DESC";
$criteria->compare('vip', 1);
}
}
...
http://www.yiiframework.com/doc/api/1.1/CDbCriteria#compare-detail