yii2
Actief record
Zoeken…
Opmerkingen
AR is perfect wanneer u een of meer records opeenvolgend moet verwijderen, bijwerken of maken. De ondersteuning van vuile attributen (alleen opslaan wat echt is gewijzigd) resulteert in geoptimaliseerde UPDATE-instructies die de belasting uit de database aanzienlijk opheft en de kansen verkleint voor verschillende conflicten die verband houden met het bewerken van hetzelfde record door meerdere personen tegelijkertijd.
Als u niet echt complexe logica in uw toepassing hebt en daarom geen abstractie-entiteiten vereist, is AR het best geschikt voor verwijderen, bijwerken en maken.
AR is ook OK voor eenvoudige zoekopdrachten met minder dan 100 records per pagina. Het is niet zo performant als het werken met arrays geproduceerd door querybuilder of asArray () maar het is prettiger om mee te werken.
AR wordt niet aanbevolen voor complexe zoekopdrachten. Meestal gaat het om het verzamelen of transformeren van gegevens, dus wat wordt geretourneerd, past toch niet in het AR-model. In dit geval verdient het de voorkeur om de querybuilder te gebruiken.
Hetzelfde geldt voor import en export. Beter om querybuilder te gebruiken vanwege grote hoeveelheden gegevens en mogelijk complexe query's.
Vind alle records
Post::find()->all();
// SELECT * FROM post
of de steno
(Retourneert een actieve recordmodelinstantie door een primaire sleutel of een reeks kolomwaarden.)
Post::findAll(condition);
geeft een reeks ActiveRecord-instanties terug.
Vind alles met waar staat
$model = User::find()
->where(['id' => $id])
->andWhere('status = :status', [':status' => $status])
->all();
Zoek alles met orderBy
$model = User::find()
->orderBy(['id'=>SORT_DESC])
->all();
Or
$model = User::find()
->orderBy(['id'=>SORT_ASC])
->all();
Waar clausule
OPERATOREN
$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'
IN
$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)
TUSSEN
$postsInBetween = Post::find()
->where(['between', 'date', "2015-06-21", "2015-06-27" ])
->all();
NUL
$postsWithNullTitle = Post::find()->where(['title' => null]);
// SELECT * FROM post WHERE title IS NULL
EN
$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL
OF
$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL
NIET
$postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'
NESTE CLAUSUSSEN
$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)
ALS OPERATOR met filter Waar activerecord-methoden
In het zoekfilter wilt u bijvoorbeeld het bericht filteren op titel of beschrijving van het bericht dat is gepost door de momenteel ingelogde gebruiker.
$title = 'test';
$description = 'test';
i) enFilterWhere ()
$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) ofFilterWhere ()
$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
Opmerking: tijdens het gebruik van filterWhere () moeten we all andwhere () of orWhere () na de filterWhere () aanroepen, anders worden alle voorwaarden verwijderd, behalve filterWhere ()
Maak een ActiveRecord-klasse met op velden gebaseerde veldenwaarde
<?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'),
]
];
}
}
Of dit kan worden gebruikt
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);
}
Zoek één record
$customer = Customer::findOne(10);
of
$customer = Customer::find()->where(['id' => 10])->one();
of
$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();
of
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
of
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
Zoek één-vragen
Zoek één record op basis van ID.
$model = User::findOne($id);
Selecteer één kolom op basis van ID.
$model = User::findOne($id)->name;
Haal het enkele record uit de database op basis van voorwaarde.
$model = User::find()->one(); // give first record
$model = User::find()->where(['id' => 2])->one(); // give single record based on id
Selecteer enkele kolommen uit de database op basis van voorwaarde.
$model = User::find()->select('name,email_id')->where(['id' => 1])->one();
OF
$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();
Actieve records met subquery's
Voorbeeld: klanten die een bericht kunnen plaatsen. Elke klant kan meerdere berichten maken. Zodra de klant het bericht maakt, wordt het bericht door de beheerders beoordeeld. Nu moeten we de klantenlijst met alle actieve berichten ophalen met behulp van een subquery.
Opmerking: als een klant 5 berichten heeft, van de 5 berichten als er minstens één inactief is, moeten we deze klant uitsluiten van de klantenlijst.
$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