IS NOT NOT不在Yii Active Record中工作

时间:2013-12-12 14:14:50

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

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

问题是什么?

4 个答案:

答案 0 :(得分:7)

主要原因。

在数据库表格列(user_city_id)中,您有空值而不是空值。 因此,您的查询无法在相应列上运行“IS NULL”和“IS NOT NULL”。

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

您可以阅读更多here

无需为第一个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');

解决方案

我不喜欢在我的模型中打扰默认搜索方法。 由于我正在使用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));
        }

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

我刚刚根据您的字段和搜索条件以及一些测试数据在MySQL,model,crud中创建了表格。在我的测试中,所有工作,两个条件都会产生一些结果。

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

答案 3 :(得分:0)

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