php - createcommand - IS NOT NULL no funciona en Yii Active Record
yii2 where (4)
Estoy intentando algo como esto:
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,
),
));
}
Aquí el problema es if
condición funciona bien y muestra resultados según la condición, pero la otra parte no funciona y no devuelve nada. Creo que IS NOT NULL
no está funcionando aquí.
Cual es el problema ?
Acabo de crear una tabla en MySQL, modelo, crud, en función de sus campos y sus criterios de búsqueda, más algunos datos de prueba. En mis pruebas todos los trabajos, ambas condiciones generan algunos resultados.
Si necesita más información sobre mis pruebas, no dude en preguntar. Supongo que el error está conectado con los datos de entrada, por lo tanto, sugiero activar el modo de depuración, agregar el componente de registro a su configuración y, a continuación, buscar en las consultas SQL que generen yii.
No estoy seguro de que esto realmente solucione tu problema. Pero al menos se adhiere a prácticas seguras de codificación:
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,
),
));
}
Tal vez $criteria->addCondition("user_city_id <> '''' ");
resuelve el problema porque IS NOT NULL se interpreta como verdadero y NULL como falso.
La razón principal.
En la columna de la tabla de la base de datos (user_city_id), tiene valores vacíos y no NULL . Por lo tanto, su consulta no puede operar "IS NULL" y "IS NOT NULL" en la columna correspondiente.
1. NULL is Special Data Type.
2. Where as Empty means a string/value which is empty.
Puedes leer más aquí
No es necesario agregar operador para la primera addCondition
Para su información, cuando agregue una condición a sus criterios, no es necesario agregar el operador "AND" porque "Y" es el operador en addConditon . Y no sirve de nada si agrega la operación para el primer addCondition, debe agregar esto para sus próximas addConditions si tiene alguna.
//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'');
La solucion es
No me gusta alterar el método de búsqueda predeterminado en mi modelo. Como estoy utilizando MVC Framework, debería seguir al menos algunas reglas de MVC. De lo contrario, no tiene sentido usar este MVC. Entonces, acceder a $ _GET cosas en mi Modelo no es bueno aquí. entonces estoy creando un nuevo método en mi Modelo con dos parámetros.
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,
));
}
Ahora, estoy usando este método de modelo desde mi controlador
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));
}
Espero que definitivamente resuelva tu problema.