IS NOT NULL不适用于Yii活动记录


IS NOT NULL not working in Yii Active Record

我正在尝试这样的东西:

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

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

问题出在哪里?

主要原因

在数据库表列(user_city_id)中,您有空值而不是NULL值

      1. NULL is Special Data Type.
      2. Where as Empty means a string/value which is empty.

你可以在这里阅读更多

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

供您参考,当您将条件添加到条件中时,无需添加"AND"运算符,因为默认情况下"AND"是addCondition中的运算符。如果你为第一个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');

解决方案是

我不喜欢干扰我的模型中的默认搜索方法当我使用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,
            ));
        }

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

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

我希望它一定能解决你的问题。

我真的不确定这是否真的能解决你的问题。但至少它坚持安全的编码实践:

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('user_address_id', $this->user_address_id);
    $criteria->compare('is_active', $this->is_active);
    $criteria->compare('create_dttm', $this->create_dttm, true);
    $criteria->compare('update_dttm', $this->update_dttm, true);
    $criteria->compare('customer_basics_id', CustomerBasics::getCustomerBasicsId(Yii::app()->session['user_id']));
    if(isset($_GET['ulip']))
        $criteria->addCondition('user_city_id IS NULL');
    else
        $criteria->addCondition('user_city_id IS NOT NULL');
    return new CActiveDataProvider($this, array(
        'criteria' => $criteria,
        'pagination' => array(
            'pageSize' => 10,
        ),
    ));
}

我刚刚在MySQL中创建了一个表,模型,crud,基于您的字段和搜索条件,以及一些测试数据。在我的测试中,这两个条件都能产生一些结果。

如果你需要更多关于我测试的信息,请毫不犹豫地询问。我想,错误与输入数据有关,因此我建议打开调试模式,将日志组件添加到配置中,然后查看yii生成的sql查询。

也许$criteria->addCondition("user_city_id <> '' ");解决了这个问题,因为IS NOT NULL被解释为true,NULL被理解为false。