Yii-2フレームワークは初めてです。 activeQueryとモデルを使用してYii-2フレームワークで次のクエリを達成するにはどうすればよいですか?.
SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1)
ありがとう
これを試すことができます:
//SELECT * FROM users AS u WHERE u.user_id IN(1,5,8) AND (u.status = 1 OR u.verified = 1) OR (u.social_account = 1 AND u.enable_social = 1)
$model = arname()->find()
->andWhere(['user_id'=>[1,5,8]])
->andWhere(['or',
['status'=>1],
['verified'=>1]
])
->orWhere(['and',
['social_account'=>1],
['enable_social'=>1]
])
->all();
これを試して -
$query = (new \yii\db\Query())
->select('*')
->from('users u')
->where(['and',['u.user_id'=>[1,5,8]],['or','u.status=1','u.verified=1']])
->orWhere(['u.social_account'=>1,'u.enable_social'=>1]);
$command = $query->createCommand();
print_r ($command->sql);die;
基本的にYii 1.0バージョンと同じYii 2.0のデータベース構成について既に知っていると思います。
ActiveQueryを使用する場合は、最初に「USERS」クラスを定義する必要があります。
<?php
namespace app\models;
use yii\db\ActiveRecord;
class USERS extends ActiveRecord {
public static function tableName()
{
return 'users';
}
}
?>
それを使用するとき、次のように書くことができます:
<?
$usr_data = USERS::find()->
->where("user_id IN(1,5,8) AND (status = 1 OR verified = 1) OR (social_account = 1 AND enable_social = 1)")
->all();
?>
私の意見では、アクティブクエリを使用すると、SQLをサブブロックで区切ることができます。ただし、このような複雑な「AND OR」WHERE条件がある場合に適用する意味はありません。
Uは次の方法でも実行できます。
$data = model::find()
->andWhere('plz = :plz',[':plz' => 40])
->andWhere('plz = :plz',[':plz' => 40000])
->all();
MongoDB
の場合:
$query->andWhere(['and',
['$eq', 'status', 1],
['$in', 'activity', [1, 2]],
]);
$query->orWhere(['$in', 'yourField', $yourArray]);
テスト済み。 DBMSと同様。
最初にまたは条件を使用します。例えば:
(new \yii\db\Query())
->select(['id', 'client', 'ts', 'action'])
->from('log_client as log')
->orWhere(['action' => 'lock'])
->orWhere(['action' => 'rel'])
->andWhere(['in', 'client', $IDs])
->orderBy(['ts' => SORT_ASC])
->all();
「AND ...(..OR ..)」のようになります
ActiveQuery
のwhere()
関数は、クエリのWHERE
条件で使用される最初のパラメーターとして文字列も受け入れます。最も簡単な方法は、これらの条件をwhere()
functionに入れることです。
ActiveRecord
モデルを使用していると仮定すると、モデルで次のようなことができます。
$this->find()
->where("user_id IN(1,5,8) AND (status = 1 OR verified = 1) OR (social_account = 1 AND enable_social = 1)")
->all();
もちろん、クエリ内の値をハードコーディングする代わりに準備されたステートメントを使用する必要がありますが、上記のコードは単にアイデアを提供するためのものです。