Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do IS NULL and IS NOT NULL with Yii 2 ActiveRecord?

I have a table which has a field `activated_at` timestamp NULL DEFAULT NULL, which means that it can contain a timestamp or it can be null and it's null by default.

I have another [gii-generated] search model with a following configuration in the search() method:

public function search($params) {     $query = User::find();      // add conditions that should always apply here      $this->load($params);      if (!$this->validate()) {         // uncomment the following line if you do not want to return any records when validation fails         // $query->where('0=1');         return $dataProvider;     }      $andFilterWhere = [         'id' => $this->id,         'status' => $this->status,         'role' => $this->role,         'created_at' => $this->created_at,         'updated_at' => $this->updated_at,         'completed_files' => $this->completed_files,         // 'activated_at' => null,     ];      if(!isset($_GET['deleted'])) {         $query->where(['deleted_at' => null]);         $andFilterWhere['deleted_at'] = null;     } else if($_GET['deleted'] === 'true') {         $query->where(['not', ['deleted_at' => null]]);     }      // grid filtering conditions     $query->andFilterWhere(         $andFilterWhere     );      $query->andFilterWhere(['like', 'first_name', $this->username])         ->andFilterWhere(['like', 'auth_key', $this->auth_key])         ->andFilterWhere(['like', 'password_hash', $this->password_hash])         ->andFilterWhere(['like', 'password_reset_token', $this->password_reset_token])         ->andFilterWhere(['like', 'email', $this->email])         ->andFilterWhere(['like', 'first_name', $this->first_name])         ->andFilterWhere(['like', 'last_name', $this->last_name]);      if($this->activated || $this->activated === "0") {         #die(var_dump($this->activated));         if($this->activated === '1') {             // this doesn't filter             $query->andFilterWhere(['not', ['activated_at' => null]]);         } else if($this->activated === '0') {             // this doesn't either             $query->andFilterWhere(['activated_at', null]);         }     }      $dataProvider = new ActiveDataProvider([         'query' => $query,     ]);      return $dataProvider; } 

Yes, I have set the activated property in my class:

public $activated; 

And my rules() method is as following:

public function rules() {     return [         [['id', 'status', 'role', 'created_at', 'updated_at', 'completed_files'], 'integer'],         ['activated', 'string'],         [['username', 'first_name', 'last_name', 'auth_key', 'password_hash', 'password_reset_token', 'email', 'deleted_at', 'completed_files', 'activated_at'], 'safe'],     ]; } 

What I was trying to set in the search() method is to filter on field activated_at depending on the $activated value (see above code):

if($this->activated || $this->activated === "0") {     #die(var_dump($this->activated));     if($this->activated === '1') {         // this doesn't filter         $query->andFilterWhere(['not', ['activated_at' => null]]);     } else if($this->activated === '0') {         // this doesn't either         $query->andFilterWhere(['activated_at', null]);         $andFilterWhere['activated_at'] = null;     } } 

I use it with GridView - every other filter works except this one.

What am I doing wrong here?

Aand how to properly do this sort of queries:

IS NULL something IS NOT NULL something 

With Yii 2's ActiveRecord query builder?


EDIT: Line: if(!isset($_GET['deleted'])) is used for something else and this works normally.

like image 818
Zlatan Omerović Avatar asked Mar 13 '17 17:03

Zlatan Omerović


People also ask

Is null in Yii2 query?

Yii2 will use "IS NULL" if the $values === null , but in case the value is supplied as an array, and one of those array elements is null, it will not get any special treatment, resulting in the query never matching any records with NULL value.

What is active query in Yii2?

An ActiveQuery can be a normal query or be used in a relational context. ActiveQuery instances are usually created by yii\db\ActiveRecord::find() and yii\db\ActiveRecord::findBySql(). Relational queries are created by yii\db\ActiveRecord::hasOne() and yii\db\ActiveRecord::hasMany().


1 Answers

If i understand right you can use andWhere

 ->andWhere(['not', ['activated_at' => null]]) 

but andFilterWhere in execute where the related value is not null

from doc http://www.yiiframework.com/doc-2.0/yii-db-query.html

andFilterWhere() Adds an additional WHERE condition to the existing one but ignores empty operands.

like image 136
ScaisEdge Avatar answered Sep 25 '22 02:09

ScaisEdge