web-dev-qa-db-ja.com

IS NULLおよびIS NOT NULL with Yii 2 ActiveRecord?

_`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']))は他の何かに使用され、これは正常に機能します。

14
omerowitz

私が正しいと理解すれば、andWhereを使用できます

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

しかし、関連する値がnullではないandFilterWhereの実行

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

andFilterWhere()既存の条件に追加のWHERE条件を追加しますが、空のオペランドは無視します。

18
scaisEdge

この式の場合:

WHERE activated_at IS NULL

これを試してください(動作しています):

->andWhere(['is', 'activated_at', new \yii\db\Expression('null')]),
12
user3551026

このソリューションは、_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
_
0
Zlocorp
$null = new Expression('NULL');

$query->andFilterWhere(['is not', 'asp_id', $null]);

OR

$query->andFilterWhere(['is', 'asp_id', $null]);
0
kociou