2017-01-20 10 views
0

私はYii2フレームワークでAPIを作成しました。 しかし私は私のステートメントでOR条件を使用する方法を知らない。Yii2クエリOR条件1列の複数の値

例: BMWまたはDODGEというブランド名ですべての車を取得しますか?

私は次のことを試してみた:

$query = Car::getCar($lang) 
     ->where(['or', ['m.brand' => 'BMW'], ['m.brand' => 'DODGE']]) 
     ->all(); 

しかし、これは動作しません。 m.brandには1つの値しか使えません。

ので:

$query = Car::getCar($lang) 
     ->where(['m.brand' => 'BMW']) 
     ->all(); 

作品だけで罰金。

いくつかの方法で入れようとしましたが、私はこれを動作させません。
誰かが私が間違っていることを知っていますか?

EDIT getCar方法のようなものを返す:

(new Query())->select(['a.auto_id'])->from('auto_new a') 

EDIT 2 が、それはで動作するようになった:

$query->andWhere(['or', ['m.brand' => 'BMW'], ['m.brand' => 'DODGE']]) 
+0

これは静的メソッド 'getCar()'が 'ActiveQuery'インスタンスを返す限り動作します。 – Bizley

+0

@Bizley getCarが返すものを追加しました。私はそれが問題だとは思わない。なぜなら、単一の列のパラメータがうまく動作するからである。 –

+0

これは奇妙で、うまくいくはずだ。 「私はこれを動作させない」という意味はどういう意味ですか?エラーがありますか、または予期した結果が表示されません。 ' - > all();'を ' - > createCommand() - > rawSql;に置き換えて出力を調べることで、このバージョンを'または 'でテストしてください。 – Bizley

答えて

2

私はあなたによく理解していれば、あなたが何かを使用することができますがこのように:

Model::find()->orWhere(['brand' => 'brand1]) 
      ->orWhere(['id' => 'brand2'])->all(); 
+0

whereをorWhereに置き換えましたが、それでもBMWのみが返されます。 –

1

where()はあなたが以下のActiveQueryを使用し、その後戻したいブランドの配列を生成することができ、この構文を使用して

SELECT * FROM car WHERE brand in ('brand1', 'brand2'); 

の線に沿ってSQLを作成するために、配列を取ることができます。

$brands = ['BMW', 'DODGE']; 
$query = Car::find()->where(['brand' => $brands])->all(); 
1

あなたが実際にそれはあなたが必要な値を持つ配列を使用して多くのことを簡素化することができます:これは、あなたが探している結果を返しますWHERE m.brand IN ('BMW', 'DODGE')ようなもので実行されます

$query = Car::getCar($lang) 
    ->where(['m.brand' => ['BMW', 'DODGE']]) 
    ->all();