Comment programmer avec Yii2 ActiveRecord

Ce que vous allez créer

Si vous demandez, "Qu'est-ce que Yii?" Découvrez mon tutoriel précédent: Introduction au framework Yii, qui passe en revue les avantages de Yii et comprend un aperçu des modifications apportées à Yii 2.0, publié en octobre 2014.

Dans cette série de programmation avec Yii2, je guide les lecteurs dans l'utilisation du framework Yii2 pour PHP. Dans le tutoriel d'aujourd'hui, je vais vous expliquer comment utiliser le mappage objet-relationnel de Yii, appelé ORM, pour travailler avec des bases de données. Il s’appelle Active Record et constitue un aspect essentiel de la programmation efficace des applications de base de données dans Yii..

Yii propose différentes manières de travailler avec votre base de données par programme, telles que les requêtes directes et un générateur de requêtes, mais l'utilisation d'Active Record offre un ensemble complet d'avantages pour la programmation de base de données orientée objet. Votre travail devient plus efficace, plus sécurisé, fonctionne dans l’architecture du contrôleur de vue modèle de Yii et est portable si vous décidez de changer de plate-forme de base de données (par exemple, MySQL vers PostgreSQL)..

Suivez-moi au fur et à mesure que je détaille les bases de Active Record dans Yii.

Juste un rappel, je participe aux commentaires ci-dessous. Je suis particulièrement intéressé si vous avez des approches différentes, des idées supplémentaires ou si vous souhaitez suggérer des sujets pour de futurs tutoriels. Si vous avez une question ou une suggestion de sujet, veuillez poster ci-dessous. Vous pouvez également me joindre directement sur Twitter @reifman.

Qu'est-ce qui est actif??

Le contrôleur de vue modèle de Yii est l'un de ses principaux avantages. Active Record fournit une solution orientée objet pour travailler avec vos bases de données, étroitement intégrée aux modèles Yii. Selon Wikipedia, le terme général Active Record a été nommé par Martin Fowler dans son livre de 2003 Modèles d'architecture d'application d'entreprise."

La documentation de Yii résume ceci de manière concise:

Une classe Active Record est associée à une table de base de données, une instance Active Record correspond à une ligne de cette table et une attribut d'une instance Active Record représente la valeur d'une colonne particulière dans cette ligne. Au lieu d'écrire des instructions SQL brutes, vous devez accéder aux attributs Active Record et appeler des méthodes Active Record pour accéder aux données stockées dans les tables de la base de données et les manipuler..

L'intégration de la structure Active Record dans Yii est une grande force du cadre, mais commune à la plupart des cadres tels que Ruby on Rails.. 

Cette abstraction des modèles aux tables de base de données permet au framework d’effectuer partout la lourde tâche de la sécurité, par exemple. décomposer les requêtes d'injection SQL.

La prise en charge de l'enregistrement actif de Yii permet également la portabilité entre plusieurs bases de données. Vous pouvez changer de base de données sans avoir à changer beaucoup de code:

  • MySQL 4.1 ou version ultérieure
  • PostgreSQL 7.3 ou version ultérieure
  • SQLite 2 et 3
  • Microsoft SQL Server 2008 ou version ultérieure
  • CUBRID 9.3 ou version ultérieure
  • Oracle
  • Sphinx: via yii \ sphinx \ ActiveRecord, nécessite le yii2-sphinx extension
  • ElasticSearch: via yii \ elasticsearch \ ActiveRecord, nécessite le yii2-elasticsearch extension

Et les bases de données NoSQL suivantes:

  • Redis 2.6.12 ou version ultérieure: via yii \ redis \ ActiveRecord, nécessite le yii2-redis extension
  • MongoDB 1.3.0 ou version ultérieure: via yii \ mongodb \ ActiveRecord, requiert le yii2-mongodb extension

Apprendre les bases

Dans l'épisode précédent, Comment programmer avec Yii2: Travailler avec la base de données et l'enregistrement actif, j'ai expliqué comment créer votre base de données, comment Yii s'y connecte pour chaque session, en utilisant une migration pour créer des tables de base de données et en utilisant le code utile de Yii échafaudage) pour créer le code de modèle par défaut. Si vous n’êtes pas familier avec cela, veuillez revoir cet épisode..

Dans cet épisode, je vais me concentrer davantage sur l'utilisation d'Active Record dans votre code..

Déclaration d'une classe d'enregistrement active dans un modèle

Tout d’abord, permettez-moi d’examiner comment transformer un modèle Yii pour tirer parti d’Active Record. Je vais utiliser un exemple de modèle que j'ai créé dans la série Building Your Startup. Cette série vous explique comment je construis ma startup, Meeting Planner, en Yii2.

Je vais utiliser l'exemple d'un modèle simple que j'ai créé appelé Launch, qui permet aux visiteurs de la page d'accueil de fournir leur adresse électronique s'ils souhaitent être avertis lorsque le produit n'a plus d'aperçu et est complètement publié..

Utiliser Active Record avec un modèle est assez simple. remarquez le classe Launch s'étend \ yii \ db \ ActiveRecord:

C'est tout.

Construire des requêtes

Regardons quelques requêtes courantes Active Record. 

Records individuels

Si vous avez un ID d'enregistrement, souvent à partir d'un paramètre de requête d'un contrôleur, il est facile de trouver l'enregistrement souhaité:

fonction publique actionSomething ($ id) $ model = Launch :: findOne ($ id);

Ceci est identique à:

$ model = Launch :: find () -> où (['id' => $ id]) -> un ();

Vous pouvez également prolonger le -> où tableau avec plusieurs champs ou conditions booléennes:

$ model = Launch :: find () -> où (['id' => $ id, 'status' => Launch :: ACTIVE_REQUEST])… // équivalent à $ model = Launch :: find () -> où (['id' => $ id) -> andWhere (['status' => Launch :: ACTIVE_REQUEST]) -> ouWhere (['status' => Launch :: FUTURE_REQUEST])… 

Plusieurs enregistrements

Voici un exemple de recherche de tous les enregistrements correspondant à un statut trié par $ id:

$ people = Launch :: find () -> where (['status' => Launch :: STATUS_REQUEST]) -> orderBy ('id') -> all ();

le -> tous (); trouve tous les enregistrements au lieu d'un seul. La variable $ personnes est renvoyé sous forme de tableau d'objets de modèle. Sinon, en l'absence de conditions, vous pouvez accéder à tous les enregistrements avec -> findAll ();

Rendre un tableau

En utilisant indexPar retourne un tableau d'éléments indexés par leur identifiant:

$ people = Launch :: find () -> indexBy ('id') -> all ();

Vous pouvez également retourner un tableau associatif avec -> asArray ():

$ people = Launch :: find () -> asArray () -> all ();

Remarque: La documentation de Yii indique: "Bien que cette méthode économise de la mémoire et améliore les performances, elle est plus proche de la couche d'abstraction de base de données inférieure et vous perdrez la plupart des fonctionnalités d'Active Record."

Comptage des records

Vous pouvez aussi retourner juste un compter à partir d'une requête:

$ count = Launch :: find () -> où (['status' => Launch :: STATUS_REQUEST]) -> count ();

J'utilise beaucoup compte dans Meeting Planner pour les statistiques par exemple; en savoir plus dans notre épisode Dashboard:

// calcule $ count_meetings_completed $ hd-> count_meetings_completed = Meeting :: find () -> où (['status' => Meeting :: STATUS_COMPLETED]) -> etWhere ('created_at<'.$since)->compter();; // calcule $ count_meetings_expired $ hd-> count_meetings_expired = Meeting :: find () -> où (['status' => Meeting :: STATUS_EXPIRED]) -> etWhere ('created_at<'.$since)->compter();; // calcule $ count_meetings_planning $ hd-> count_meetings_planning = Réunion :: find () -> où ('status<'.Meeting::STATUS_COMPLETED)->andWhere ('created_at<'.$since)->compter();; // calcule $ count_places $ hd-> count_places = Place :: find () -> où ('created_at>'. $ after) -> etWhere ('created_at<'.$since)->compter();

Accéder aux données

Une fois que vous avez interrogé des données, telles qu'un modèle individuel, vous pouvez facilement accéder aux données en tant qu'objet de modèle:

$ model = Launch :: findOne ($ id); $ id = $ model-> id; $ email = $ model-> email;

Je traite souvent les tableaux de cette façon:

$ users = User :: findAll (); foreach ($ utilisateurs en tant que $ u) $ id = $ u-> id; $ email = $ u-> email;

Assignation massive

Vous pouvez également affecter rapidement un tableau à un enregistrement de modèle via ActiveRecord:

$ values ​​= ['name' => 'James', 'email' => '[email protected]',]; $ client = nouveau client (); $ client-> attributs = $ valeurs; $ client-> save ();

Ceci est souvent utilisé pour renseigner les données de modèle après la soumission d'un formulaire:

if (isset ($ _ POST ['Nom du formulaire'])) $ modèle-> attributs = $ _POST ['Nom du formulaire']]; if ($ model-> save ()) // gérer le succès

Ou vous pouvez utiliser -> charge () pour ça:

if ($ model-> load (Yii :: $ app-> request-> post ()) && $ model-> save ()) …

Le générateur de code d'échafaudage Giii de Yii est idéal pour générer des modèles à l'aide d'ActiveRecord qui font beaucoup de cela pour vous, par exemple. modèles, contrôleurs, formulaires, vues, etc..

La sauvegarde des données

Comme vous pouvez le voir ci-dessus, la sauvegarde de données avec Active Record est également facile. Dans cet exemple de la documentation Yii, un nouvel enregistrement est créé et enregistré - puis un enregistrement est chargé par son identifiant et les mises à jour sont enregistrées:

// insère une nouvelle ligne de données $ customer = new Customer (); $ customer-> name = 'James'; $ customer-> email = '[email protected]'; $ client-> save (); // met à jour une ligne de données existante $ customer = Customer :: findOne (123); $ customer-> email = '[email protected]'; $ client-> save ();

Supprimer des enregistrements

La suppression d'un enregistrement est encore plus facile:

$ u = User :: findOne (99); $ u-> delete ();

Mise à jour des compteurs

Yii offre également des incréments de compteur faciles. Supposons qu'un utilisateur planifie une autre réunion et que je surveille le nombre d'utilisateurs dans le tableau des utilisateurs:

$ u = User :: findOne (99); $ u-> updateCounters (['meeting_count' => 1]); // équivalent à // UPDATE 'Utilisateur' SET 'meeting_count' = 'meeting_count' + 1 WHERE 'id' = 99 

Rapports

La connexion de tables entre index est l’une des fonctionnalités les plus puissantes d’Active Record. Par exemple, dans Meeting Planner, chaque réunion peut avoir 0 ou plus Lieux de rencontre. Le modèle Meeting.php définit un ActiveQuery relationnel pour cela:

* @property MeetingPlace [] $ meetingPlaces / ** * @return \ yii \ db \ ActiveQuery * / fonction publique getMeetingPlaces () return $ this-> hasMany (MeetingPlace :: className (), ['meeting_id' => 'id ']); 

Ensuite, je peux accéder à tous les lieux de réunion avec le $ meetingplaces propriété. Ci-dessous, je charge une réunion et itère sur tous ses lieux de rencontre assez facilement comme s'il s'agissait d'un tableau intégré de sous-objets:

$ mtg = Meeting :: find () -> Where (['id' => $ meeting_id]) -> one (); foreach ($ mtg-> meetingPlaces as $ mp) …

Bien entendu, cela repose sur la création d'une clé étrangère lorsque vous créez la table dans sa migration:

$ this-> createTable ('% meeting_place', ['id' => Schema :: TYPE_PK, 'meeting_id' => Schema :: TYPE_INTEGER. 'NOT NULL', 'place_id' => Schéma :: TYPE_INTEGER . 'NOT NULL', 'suggérée_by' => Schéma :: TYPE_BIGINT. 'NOT NULL', 'status' => Schéma :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Schéma :: TYPE_INTEGER. 'NOT NULL ',' updated_at '=> Schema :: TYPE_INTEGER.' NOT NULL ',], $ tableOptions); $ this-> addForeignKey ('fk_meeting_place_meeting', '% meeting_place', 'id_reunion', '% meeting', 'id', 'CASCADE', 'CASCADE'); 

Et après

J'espère que cela a fourni une introduction facile à quelques-unes des merveilles d'Active Record. Il inclut également les cycles de vie, les transactions et le verrouillage, sur lesquels je pourrais parler dans le futur. Si vous voulez aller de l'avant, Yii2 propose deux domaines intéressants pour en apprendre davantage dans sa documentation: les spécifications fonctionnelles du Guide de l'enregistrement actif Yii2 et les spécifications fonctionnelles de l'enregistrement actif Yii2. Ce sont des introductions bien écrites.

Surveillez les prochains tutoriels de la série Programmation avec Yii2 pendant que nous continuons à plonger dans différents aspects du cadre. Vous pouvez également consulter la série susmentionnée Construire votre démarrage avec PHP.

Si vous souhaitez savoir quand le prochain tutoriel Yii2 arrive, suivez-moi @reifman sur Twitter ou consultez ma page d'instructeur.. 

Liens connexes

  • Comment programmer avec Yii2: Travailler avec la base de données et l'enregistrement actif (Envato Tuts +)
  • Yii2 Guide de l'enregistrement actif
  • Spécification fonctionnelle Yii2 Active Record
  • Modèle d'enregistrement actif (Wikipedia)
  • Yii2 Developer Exchange, mon site de ressources Yii2