IS NOT NOT不在Yii Active Record中工作

J.K*_*.A. 7 php mysql yii

我正在尝试这样的事情:

public function search() {

        $criteria = new CDbCriteria;

        $criteria->compare('user_details_id', $this->user_details_id);
        $criteria->compare('user_type_id', $this->user_type_id);
        $criteria->compare('customer_basics_id', $this->customer_basics_id);
        $criteria->compare('user_address_id', $this->user_address_id);
        $criteria->compare('user_city_id', $this->user_city_id);
        $criteria->compare('is_active', $this->is_active);
        $criteria->compare('create_dttm', $this->create_dttm, true);
        $criteria->compare('update_dttm', $this->update_dttm, true);

        // if condition is working
        if (isset($_GET['ulip'])) {
            $criteria->addCondition(
                    "customer_basics_id=" . CustomerBasics::getCustomerBasicsId(Yii::app()->session['user_id']), "AND"
            );
            $criteria->addCondition("user_city_id IS NULL");
        // else condition is working
        } else {
            $criteria->addCondition(
                    "customer_basics_id=" . CustomerBasics::getCustomerBasicsId(Yii::app()->session['user_id']), "AND"
            );
            $criteria->addCondition("user_city_id IS NOT NULL");
        }


    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
        'pagination' => array(
            'pageSize' => 10,
        ),
    ));
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是if条件工作正常并根据条件显示结果但是部分不起作用并且它什么都不返回.我认为IS NOT NULL这不起作用.

有什么问题?

Hea*_*man 7

主要原因.

在数据库表列(user_city_id)中,您具有Empty值而不是NULL值.因此,您的查询无法在相应列上运行"IS NULL"和"IS NOT NULL".

      1. NULL is Special Data Type.
      2. Where as Empty means a string/value which is empty.
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多

无需为第一个addCondition添加运算符

为了您的信息,当您为条件添加条件时,无需添加"AND"运算符becoz默认情况下"AND"是addConditon中的运算符.如果你为第一个addCondition添加操作就没用了,如果有的话,你应该为你的下一个addConditions添加它.

     //AND is not required here as AND is default operation. 
     //This operator (AND) wont help in first condition.
     $criteria->addCondition('condition1=1','AND');

     //This bellow condition will be concatenate with above condition so, here operator is required.
     $criteria->addCondition('condition2=1','OR');
Run Code Online (Sandbox Code Playgroud)

解决方案是

我不喜欢在我的模型中打扰默认搜索方法. 因为我正在使用MVC框架,所以我应该遵循至少一些MVC规则.否则使用此MVC没有任何意义.所以,在我的模型中访问$ _GET的东西在这里并不好.所以我在我的模型中用两个参数创建一个新方法.

        function yourModelMethod($isParamExist,$customer_basics_id)
        {
            $criteria = new CDbCriteria;
            $criteria->condition = "customer_basics_id=$customer_basics_id";        
            if($isParamExist)
            {            
                $criteria->condition='TRIM(user_city_id) =""';
            }
            else
            {
                $criteria->condition='TRIM(return_date) !=""';
            }

            return new CActiveDataProvider($this, array(
                'criteria' => $criteria,
            ));
        }
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用我的控制器中的这个模型方法

        function actionYourController()
        {
            $model=new MyModel();        
            $isParamExist=isset($_GET['ulip']);
            $customer_basics_id=CustomerBasics::getCustomerBasicsId(Yii::app()->session['user_id']);        
            $activeData=$model->yourModelMethod($isParamExist,$customer_basics_id);
            $this->render('myView',array('activeData'=>$activeData));
        }
Run Code Online (Sandbox Code Playgroud)

我希望,它肯定会解决你的问题.