_`activated_at` timestamp NULL DEFAULT NULL
_フィールドを持つテーブルがあります。これは、タイムスタンプを含めることができるか、デフォルトでnull
であり、null
であることを意味します。
search()
メソッドに次の構成を持つ別の[gii生成]検索モデルがあります。
_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;
}
_
はい、クラスでactivated
プロパティを設定しました:
_public $activated;
_
そして、私のrules()
メソッドは次のとおりです。
_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'],
];
}
_
search()
メソッドで設定しようとしていたのは、_activated_at
_値に応じてフィールド_$activated
_でフィルタリングすることです(上記のコードを参照)。
_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;
}
}
_
GridView
で使用します。これ以外のすべてのフィルターは機能します。
ここで何が間違っていますか?
Aandこの種のクエリを適切に行う方法:
_IS NULL something
IS NOT NULL something
_
Yii 2のActiveRecord
クエリビルダー?
EDIT:行:if(!isset($_GET['deleted']))
は他の何かに使用され、これは正常に機能します。
私が正しいと理解すれば、andWhereを使用できます
->andWhere(['not', ['activated_at' => null]])
しかし、関連する値がnullではないandFilterWhereの実行
docから http://www.yiiframework.com/doc-2.0/yii-db-query.html
andFilterWhere()既存の条件に追加のWHERE条件を追加しますが、空のオペランドは無視します。
この式の場合:
WHERE activated_at IS NULL
これを試してください(動作しています):
->andWhere(['is', 'activated_at', new \yii\db\Expression('null')]),
このソリューションは、_column_name
_が空またはNULLかどうかをチェックします
WHERE (LENGTH(`column_name`) > 0)
_->andWhere(['>', 'LENGTH(column_name)', 0]) //check if empty or null
_
別のバリアント-NULLのみをチェックする
_WHERE column_name IS NOT NULL
_
_->andWhere(['IS NOT', 'column_name', null]); // check on null
_
$null = new Expression('NULL');
$query->andFilterWhere(['is not', 'asp_id', $null]);
OR
$query->andFilterWhere(['is', 'asp_id', $null]);