Comment faire is NULL et is not NULL avec Yii 2 ActiveRecord?

J'ai une table qui contient un champ `activated_at` timestamp NULL DEFAULT NULL, ce qui signifie qu'il peut contenir un timestamp ou il peut être null et c'est null par défaut.

J'ai une autre [gii-généré] modèle de recherche avec une configuration suivante dans le search() méthode:

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

Oui, j'ai mis le activated bien dans ma classe:

public $activated;

Et mon rules() méthode est comme suit:

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'],
];
}

Ce que j'ai essayé de mettre dans la search() méthode consiste à filtrer sur le terrain activated_at selon le $activated valeur (voir le code ci-dessus):

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

Je l'utilise avec GridView - tous les autres filtre fonctionne sauf celui-ci.

Ce que je fais mal ici?

Et la façon de bien faire ce genre de requêtes:

IS NULL something
IS NOT NULL something

Avec Yii 2 ActiveRecord générateur de requêtes?


EDIT: Ligne: if(!isset($_GET['deleted'])) est utilisé pour autre chose et cela fonctionne normalement.

InformationsquelleAutor omerowitz | 2017-03-13