yii2
Aktywny rekord
Szukaj…
Uwagi
AR jest idealny, gdy trzeba kolejno usuwać, aktualizować lub tworzyć jeden lub więcej rekordów. Jego obsługa brudnych atrybutów (zapisywanie tylko tego, co zostało naprawdę zmienione) skutkuje zoptymalizowanymi instrukcjami UPDATE, które znacznie odciążają bazę danych i zmniejszają szanse na różne konflikty związane z edycją tego samego rekordu przez wiele osób jednocześnie.
Jeśli nie masz naprawdę złożonej logiki w swojej aplikacji, a zatem nie wymaga ona abstrakcji, AR najlepiej nadaje się do usuwania, aktualizacji i tworzenia.
AR jest również OK dla prostych zapytań, których wynikiem jest mniej niż 100 rekordów na stronę. Nie jest tak wydajny, jak praca z tablicami utworzonymi przez kreator zapytań lub asArray (), ale sprawia przyjemność z pracy.
AR nie jest zalecane w przypadku złożonych zapytań. Zwykle dotyczą one agregowania lub przekształcania danych, więc to, co zostało zwrócone, i tak nie pasuje do modelu AR. W tym przypadku lepiej jest użyć konstruktora zapytań.
To samo dotyczy importu i eksportu. Lepiej używać konstruktora zapytań ze względu na dużą ilość danych i możliwe złożone zapytania.
Znajdź wszystkie rekordy
Post::find()->all();
// SELECT * FROM post
lub stenografia
(Zwraca instancję aktywnego modelu rekordu przez klucz podstawowy lub tablicę wartości kolumn).
Post::findAll(condition);
zwraca tablicę instancji ActiveRecord.
Znajdź wszystko, gdzie warunek
$model = User::find()
->where(['id' => $id])
->andWhere('status = :status', [':status' => $status])
->all();
Znajdź wszystko z zamówieniem
$model = User::find()
->orderBy(['id'=>SORT_DESC])
->all();
Or
$model = User::find()
->orderBy(['id'=>SORT_ASC])
->all();
Gdzie klauzula
OPERATORZY
$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'
W
$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)
POMIĘDZY
$postsInBetween = Post::find()
->where(['between', 'date', "2015-06-21", "2015-06-27" ])
->all();
ZERO
$postsWithNullTitle = Post::find()->where(['title' => null]);
// SELECT * FROM post WHERE title IS NULL
I
$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL
LUB
$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL
NIE
$postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'
NESTED CLAUSES
$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)
PODOBNY OPERATOR z filtrem Gdzie aktywne metody rejestrowania
Na przykład w filtrze wyszukiwania chcesz filtrować post, pisząc tytuł posta lub opis opublikowany przez aktualnie zalogowanego użytkownika.
$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
Uwaga: Korzystając z filterWhere () musimy wywołać all iwhere () lub orWhere () po filterWhere (), w przeciwnym razie wszystkie warunki, które zostaną usunięte, oprócz filterWhere ()
Utwórz klasę ActiveRecord z wartością pól opartych na zdarzeniach
<?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'),
]
];
}
}
Lub można to wykorzystać
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);
}
Znajdź jeden rekord
$customer = Customer::findOne(10);
lub
$customer = Customer::find()->where(['id' => 10])->one();
lub
$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();
lub
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
lub
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
Znajdź jedno zapytanie
Znajdź pojedynczy rekord na podstawie identyfikatora.
$model = User::findOne($id);
Wybierz pojedynczą kolumnę na podstawie identyfikatora.
$model = User::findOne($id)->name;
Pobierz pojedynczy rekord z bazy danych na podstawie warunku.
$model = User::find()->one(); // give first record
$model = User::find()->where(['id' => 2])->one(); // give single record based on id
Wybierz rekord pojedynczej kolumny z bazy danych na podstawie warunku.
$model = User::find()->select('name,email_id')->where(['id' => 1])->one();
LUB
$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();
Zamów przez
$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();
Aktywne rekordy z pod-zapytaniami
Przykład: klienci, którzy mogą utworzyć post. Każdy klient może utworzyć wiele postów. Gdy tylko klient utworzy post, post zostanie sprawdzony przez administratorów. Teraz musimy pobrać listę klientów, którzy mają wszystkie aktywne posty, używając zapytania podrzędnego.
Uwaga: jeśli klient ma 5 postów, spośród 5 postów, jeśli ma co najmniej jeden nieaktywny, musimy wykluczyć tego klienta z listy klientów.
$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