Cdbcriteria Skips The First Conditions

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);



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

Thanks