yii2
アクティブレコード
サーチ…
備考
ARは、1つ以上のレコードを順次削除、更新、または作成する必要がある場合に最適です。ダーティ属性(実際に変更されたもののみを保存する)のサポートにより、データベースからの負荷を大幅に軽減し、同時に複数の人物が同じレコードを編集する際のさまざまな競合の可能性を減らす最適化UPDATE文が得られます。
アプリケーションに実際に複雑なロジックがなく、抽象エンティティを必要としない場合は、ARが削除、更新、作成に最適です。
ARは、1ページあたり100レコード未満の結果をもたらす単純なクエリに対してもOKです。これは、クエリビルダーやasArray()で生成された配列を処理するのと同じようには機能しませんが、操作するほうが楽です。
ARは複雑なクエリにはお勧めできません。これらは通常、データの集約または変換に関するものであるため、返されるものはARモデルにはあまり適合しません。この場合は、クエリビルダを使用することをお勧めします。
同じことがインポートとエクスポートになります。大量のデータと場合によっては複雑なクエリが原因で、クエリビルダを使用する方が効果的です。
すべてのレコードを検索
Post::find()->all();
// SELECT * FROM post
または短縮形
主キーまたは列値の配列によってアクティブなレコードモデルインスタンスを返します。
Post::findAll(condition);
ActiveRecordインスタンスの配列を返します。
すべてを条件と一緒に検索
$model = User::find()
->where(['id' => $id])
->andWhere('status = :status', [':status' => $status])
->all();
orderByですべてを検索
$model = User::find()
->orderBy(['id'=>SORT_DESC])
->all();
Or
$model = User::find()
->orderBy(['id'=>SORT_ASC])
->all();
Where句
オペレーター
$postsGreaterThan = Post::find()->where(['>', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at > '2016-01-25'
$postsLessThan = Post::find()->where(['<', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at < '2016-01-25'
$postsNotEqual = Post::find()->where(['<>', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at <> '2016-01-25'
に
$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)
の間に
$postsInBetween = Post::find()
->where(['between', 'date', "2015-06-21", "2015-06-27" ])
->all();
ヌル
$postsWithNullTitle = Post::find()->where(['title' => null]);
// SELECT * FROM post WHERE title IS NULL
そして
$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL
または
$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL
NOT
$postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'
ネストされた条項
$postsNestedWhere = Post::find()->andWhere([
'or',
['title' => null],
['body' => null]
])->orWhere([
'and',
['not', ['title' => null]],
['body' => null]
]);
// SELECT * FROM post WHERE (title IS NULL OR body IS NULL) OR (title IS NOT NULL AND body IS NULL)
LIKE OPERATOR with filterWhereアクティブなレコードメソッド
たとえば、検索フィルタでは、現在ログインしているユーザーが投稿した投稿のタイトルや説明を公開して投稿をフィルタします。
$title = 'test';
$description = 'test';
i)andFilterWhere()
$postLIKE = Post::find()->where(['user_id' => Yii::$app->user->getId()])->andfilterWhere(['or', ['title' => $title, 'description' => $description]])->all();
//SELECT * FROM post WHERE user_id = 2 AND ((`title` LIKE '%test%') OR (`description` LIKE '%test%'))
ii)orFilterWhere()
$postLIKE = Post::find()->where(['user_id' => Yii::$app->user->getId()])->orFilterWhere(['or', ['title' => $title, 'description' => $description]])->all();
//SELECT * FROM post WHERE user_id = 2 OR ((`title` LIKE '%test%') OR (`description` LIKE '%test%'))
iii)filterWhere()
$postLIKE = Post::find()->filterWhere(['AND', ['title' => $title, 'description' => $description]])->andWhere(['user_id' => Yii::$app->user->getId()])->all();
//SELECT * FROM post WHERE ((`title` LIKE '%test%') AND (`description` LIKE '%test%')) AND user_id = 2
注意: filterWhere()を使用している間は、filterWhere()の後にall andwhere()またはorWhere()を呼び出す必要があります。
イベントベースのフィールド値を持つActiveRecordクラスを作成する
<?php
namespace models;
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
class Post extends ActiveRecord
{
public static function tableName()
{
return 'post';
}
public function rules() {
return [
[['created_at', 'updated_at'], 'safe'],
];
}
public function behaviors() {
parent::behaviors();
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
],
'value' => date('Y-m-d H:i:s'),
]
];
}
}
または、これを使用することができます
public function beforeSave($insert)
{
if($this->isNewRecord){
//When create
}else{
//When update
}
return parent::beforeSave($insert);
}
public function afterSave($insert, $changedAttributes )
{
if($insert){
//When create
}else{
//When update
}
return parent::afterSave($insert, $changedAttributes);
}
レコードを1つ見つける
$customer = Customer::findOne(10);
または
$customer = Customer::find()->where(['id' => 10])->one();
または
$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();
または
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
または
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
1つのクエリを検索する
idに基づいて単一レコードを検索します。
$model = User::findOne($id);
idに基づいて単一列を選択します。
$model = User::findOne($id)->name;
条件に基づいてデータベースから単一のレコードを取得します。
$model = User::find()->one(); // give first record
$model = User::find()->where(['id' => 2])->one(); // give single record based on id
条件に基づいてデータベースから単一列のレコードを選択します。
$model = User::find()->select('name,email_id')->where(['id' => 1])->one();
または
$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();
OrderBy
$model = User::find()->select(['id','name','email_id'])->orderBy(['id' => SORT_DESC])->one();
OR
$model = User::find()->select(['id','name','email_id'])->orderBy(['id' => SORT_ASC])->one();
サブクエリを含むアクティブなレコード
例:投稿を作成できる顧客。各顧客は複数の投稿を作成できます。顧客が投稿を作成するとすぐに、投稿は管理者のレビューの下に置かれます。これで、サブクエリを使用してすべてのアクティブな投稿を持つ顧客リストを取得する必要があります。
注:お客様に5つの投稿がある場合、5つの投稿のうち少なくとも1つが非表示の場合は、この顧客を顧客リストから除外する必要があります。
$subQuery = Post::find()->select(['customer_id'])->where(['status' => 2]); //fetch the customers whos posts are inactive - subquery
$query = Customer::find()->where(['NOT IN', 'id', $subQuery])->all(); //Exclude the customers whos posts are inactive by using subquery