yii2
Record actif
Recherche…
Remarques
AR est parfait lorsque vous devez supprimer, mettre à jour ou créer un ou plusieurs enregistrements de manière séquentielle. Sa prise en charge des attributs sales (en ne sauvegardant que ce qui a été réellement modifié) permet d'optimiser les instructions UPDATE, ce qui soulève considérablement la charge de la base de données et réduit les risques de conflits liés à l'édition simultanée de plusieurs enregistrements.
Si vous n'avez pas de logique très complexe dans votre application et que, par conséquent, elle ne nécessite pas d'entités abstraites, AR est la solution idéale pour les suppressions, les mises à jour et les créations.
AR est également OK pour les requêtes simples résultant en moins de 100 enregistrements par page. Ce n'est pas aussi performant que de travailler avec des tableaux produits par le générateur de requêtes ou asArray (), mais c'est plus agréable de travailler avec.
AR n'est pas recommandé pour les requêtes complexes. Il s’agit généralement d’agréger ou de transformer des données, de sorte que ce qui est renvoyé ne convient pas au modèle AR. Il est préférable d'utiliser le générateur de requêtes dans ce cas.
Même chose pour l'importation et l'exportation. Mieux vaut utiliser le générateur de requêtes en raison de la grande quantité de données et des requêtes éventuellement complexes.
Trouver tous les enregistrements
Post::find()->all();
// SELECT * FROM post
ou la sténographie
(Retourne une instance de modèle d'enregistrement actif par une clé primaire ou un tableau de valeurs de colonne.)
Post::findAll(condition);
renvoie un tableau d'instances ActiveRecord.
Trouver tout avec où Condition
$model = User::find()
->where(['id' => $id])
->andWhere('status = :status', [':status' => $status])
->all();
Trouver tout avec la commandePar
$model = User::find()
->orderBy(['id'=>SORT_DESC])
->all();
Or
$model = User::find()
->orderBy(['id'=>SORT_ASC])
->all();
Clause Where
LES OPÉRATEURS
$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'
DANS
$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)
ENTRE
$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
ET
$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL
OU
$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL
NE PAS
$postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'
CLAUSES NESTED
$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)
COMME OPÉRATEUR avec un filtre
Par exemple, dans le filtre de recherche, vous souhaitez filtrer la publication en recherchant un titre ou une description de publication publié par l'utilisateur actuellement connecté.
$title = 'test';
$description = 'test';
i) etFiltreWhere ()
$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) ouFiltreWhere ()
$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
Note: Lors de l'utilisation de filterWhere (), nous devons appeler all andwhere () ou orWhere () après le filterWhere () sinon tous les conditions seront supprimées sauf filterWhere ()
Créer une classe ActiveRecord avec la valeur des champs basés sur des événements
<?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'),
]
];
}
}
Ou cela peut être utilisé
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);
}
Trouver un enregistrement
$customer = Customer::findOne(10);
ou
$customer = Customer::find()->where(['id' => 10])->one();
ou
$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();
ou
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
ou
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
Trouver une requête
Trouver un enregistrement unique basé sur l'identifiant.
$model = User::findOne($id);
Sélectionnez une seule colonne en fonction de l'identifiant.
$model = User::findOne($id)->name;
Récupère l'enregistrement unique de la base de données en fonction de la condition.
$model = User::find()->one(); // give first record
$model = User::find()->where(['id' => 2])->one(); // give single record based on id
Sélectionnez un enregistrement de colonnes unique dans la base de données en fonction de la condition.
$model = User::find()->select('name,email_id')->where(['id' => 1])->one();
OU
$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();
Commandé par
$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();
Enregistrements actifs avec sous-requêtes
Exemple: Clients pouvant créer une publication. Chaque client peut créer plusieurs messages. Dès que le client crée la publication, la publication sera examinée par les administrateurs. Maintenant, nous devons récupérer la liste des clients qui ont tous les messages actifs en utilisant la sous-requête.
Remarque: Si un client a 5 messages, parmi 5 messages s'il en a au moins un inactif, nous devons exclure ce client de la liste des clients.
$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