Dans cette mini-série Nettuts +, nous allons créer une application Web à partir de zéro, tout en plongeant dans un nouveau cadre génial pour PHP qui prend rapidement de l'ampleur, appelé Laravel..
Dans cette leçon, nous allons travailler sur une partie intégrante de toute application Web: les modèles. En chemin, nous en apprendrons davantage sur l'impressionnante mise en œuvre de l'ORM de Laravel: Eloquent.
Bienvenue à notre Applications Web à partir de zéro avec Laravel séries! Dans le premier tutoriel de la série, nous avons beaucoup appris sur Laravel et sa philosophie:
Si vous ne l'avez pas encore lu, vous devriez jeter un coup d'œil au didacticiel précédent et le lire - cela facilitera la compréhension de la philosophie de Laravel et de la plupart des sujets abordés dans ce didacticiel..
Dans cette deuxième partie de la série Laravel, nous allons construire une partie cruciale de notre application web de test, Instapics, qui est l'implémentation du modèle. Sans plus tarder, commençons!
J'ai déjà parlé un peu de ce que Des modèles sont dans un de mes articles précédents, Zend Framework de Scratch - Modèles et Integrating Doctrine ORM, alors pour éviter de me répéter, je vais écrire l'essentiel de ce que j'ai écrit auparavant. N'hésitez pas à consulter l'autre didacticiel et à en savoir plus sur les modèles disponibles..
Résumé:
Les modèles dans Laravel, ou dans la plupart des cadres, sont développés de la même manière. La différence est que Laravel nous donne un moyen facile de construire ces modèles en nous fournissant des méthodes à usage général dont la plupart des modèles auraient besoin - la Eloquent ORM.
Un ORM est un mappeur relationnel-objet, et Laravel en a un que vous allez adorer! Il s'appelle "Eloquent", car il vous permet de travailler avec vos objets de base de données et vos relations en utilisant une syntaxe éloquente et expressive..
Eloquent ORM est l'implémentation ORM intégrée de Laravel. À mon avis, c'est l'une des meilleures implémentations ORM que j'ai vues jusqu'à présent - rivalisant même avec Doctrine ORM. Il est incroyablement élégant et utilise des conventions standard pour réduire la configuration..
Par exemple, l’utilisation d’un modèle Eloquent suppose que la table qu’il représente a une identifiant
champ. le identifiant
est la clé primaire de tout enregistrement et est utilisée par la plupart des méthodes Eloquent.
Eloquent suppose également que votre nom de table est la forme plurielle de votre modèle. Par exemple, votre Utilisateur
le modèle référencera le utilisateurs
table. Comme cela peut ne pas toujours être la norme pour certains, Laravel fournit un moyen de le remplacer: utilisez simplement le $ table
drapeau:
La classe utilisateur étend Eloquent public static $ table = 'my_users';
Ceci indiquera à Laravel de ne pas utiliser la convention mais d'utiliser la table spécifiée.
Enfin, Laravel peut également automatiser la création et la mise à jour des horodatages pour nous. Pour ce faire, ajoutez un créé à
et / ou updated_at
colonne dans la table et définissez le $ horodatage
drapeau dans le modèle:
la classe User étend Eloquent public static $ timestamps = true;
Eloquent verra le drapeau et définira automatiquement le créé à
champ sur la création, et mettre à jour le updated_at
champ chaque fois qu'un enregistrement est mis à jour. Plutôt cool, hein?
La récupération des enregistrements est un jeu d'enfant avec les méthodes de récupération d'Eloquent. Par exemple, vous devez rechercher un enregistrement d'utilisateur spécifique? Il suffit de faire:
$ user = User :: find ($ user_id);
Cela retourne un Utilisateur
modèle sur lequel vous pouvez effectuer des opérations! Besoin d'utiliser des conditionnels? Imaginons que vous souhaitiez récupérer un utilisateur par adresse électronique. Pour accomplir cette tâche, vous pouvez faire quelque chose comme:
$ user = User :: where ('email', '=', $ email) -> premier ();
Vous pouvez également utiliser les méthodes dynamiques de Laravel:
$ user = User :: where_email ($ email) -> premier ();
L'insertion et la mise à jour de modèles à l'aide d'Eloquent peuvent être réalisées en trois étapes..
$ utilisateur = nouvel utilisateur (); // ou récupère un utilisateur existant $ user = User :: get ($ user_id);
$ user-> email = '[email protected]'; $ utilisateur-> mot de passe = 'test1234';
$ user-> save ();
Eloquent rend le processus de définition des relations et de récupération des modèles associés simple et intuitif.
Bon sang c'est vrai! Eloquent prend en charge trois types de relations:
Pour définir une relation entre les modèles, vous devez créer une méthode dans les deux modèles qui "décrit" leurs relations. Par exemple, disons un Utilisateur
en a un
Profil de l'utilisateur
. Vous pouvez le faire en définissant un profil de l'utilisateur
méthode dans le Utilisateur
modèle:
la classe User étend Eloquent public function user_profile () return $ this-> has_one ('User_Profile');
Parce que Utilisateur
est notre modèle "dominant" ici (c’est-à-dire qu’un utilisateur a un profil et pas un profil a un utilisateur), nous définissons le Profil de l'utilisateur
appartient à
une Utilisateur
:
La classe User_Profile s'étend à Eloquent public function user () return $ this-> appartient_to ('User');
Une fois que nous avons défini ces relations, nous pouvons alors:
/ * Obtient l'objet User_Profile d'un utilisateur Cela exécute deux requêtes SQL: SELECT * FROM 'utilisateurs' WHERE 'id' = $ utilisateur_id SELECT * FROM 'profils_utilisateur' WHERE 'utilisateur_id' = $ utilisateur_id * / $ utilisateur = utilisateur :: find ($ user_id); $ user_profile = $ user-> user_profile; / * Nous pouvons également le faire dans le sens inverse * / $ user_profile = User_Profile :: where ('user_id', '=', $ user_id) -> first (); $ user = $ user_profile-> user;
Une autre chose à noter est une autre convention: Eloquent suppose que la clé étrangère utilisée dans Profil de l'utilisateur
est le nom de la table référencée + _id
. Encore une fois, si vous voulez changer ce comportement, vous pouvez le remplacer:
la classe User étend Eloquent public function user_profile () return $ this-> has_one ('User_Profile', 'user_profile_user_id');
Disons que nous voulons définir la relation entre un Utilisateur
et son Photo
uploads. C'est un Un à plusieurs relation, contrairement à la Utilisateur
-à-Profil de l'utilisateur
relation qui était Un par un. Nous savons que celui Utilisateur
a beaucoup
Photo
uploads, donc:
La classe User étend Eloquent photos de fonction publique () return $ this-> has_many ('Photo'); … La classe photo étend Eloquent fonction publique user () return $ this-> appartient_to ('Utilisateur');
La principale différence ici avec en a un
est-ce que la fonction que nous allons utiliser pour récupérer un Utilisateur
Les photos vont maintenant retourner un tableau de Photo
objets. Donc, si nous voulions aller tous chercher Utilisateur
Les photos, on pourrait faire:
$ photos = User :: find ($ user_id) -> photos; foreach ($ photos as $ photo) …
Non, se référant à Photos
en tant que propriété n'est pas une faute de frappe. Laravel nous donne ce joli morceau de sucre. Nous pourrions aussi faire:
$ photos = User :: find ($ user_id) -> photos () -> get ();
Celui-ci est un peu délicat, mais une fois implémenté, il est facile à manipuler Plusieurs à plusieurs relations entre les modèles. Imaginons, par exemple, que vous ayez à nouveau un Utilisateur
modèle, et chacun de ces utilisateurs peut avoir plusieurs Groupes
. UNE Groupe
peut aussi avoir plusieurs Utilisateurs
. Nous utiliserons trois tables pour représenter ces relations particulières:
La convention sur la structure de la table recherchée par Eloquent ressemblera à ceci:
Une autre convention à noter ici est que la table intermédiaire, utilisateur_groupe
, est le nom singulier des deux tables qu’il associe, classées par ordre alphabétique avec un tiret bas. Comme toujours, nous sommes libres de passer outre cela.
Voici comment le code apparaîtra dans chacun des modèles pour ces trois tables:
class User étend Eloquent public function groups () // si nous voulions redéfinir la convention de dénomination // par défaut pour la table intermédiaire, nous pouvons le faire comme suit: // return $ this-> has_many_and_belongs_to ('Group', ' group_listings '); return $ this-> has_many_and_belongs_to ('Groupe'); … Class Group étend Eloquent public function users () // si nous voulions remplacer la convention de dénomination par défaut // pour la table intermédiaire, nous pouvons le faire comme suit: // return $ this-> has_many_and_belongs_to ('User ',' group_listings '); return $ this-> has_many_and_belongs_to ('Utilisateur'); … Class Group_User étend Eloquent fonction publique group () return $ this-> has_one ('Groupe'); fonction publique user () return $ this-> has_one ('User');
Ceci mis en place, nous pouvons alors tirer parti des fonctions relationnelles d’Eloquent:
// Obtenir les groupes d'un utilisateur $ groups = User :: find ($ user_id) -> groups; // Obtient tous les utilisateurs d'un groupe $ users = Group :: find ($ group_id) -> users;
Continuer avec notre application web, Instapics, Commençons par créer la base de données de notre application. Pour ce faire, notons les fonctionnalités souhaitées de l'application:
Nous pouvons en déduire les tables de base de données nécessaires:
Allons-y et créons ces tables. Pour ce projet, je vais utiliser MySQL; n'hésitez pas à copier et coller ces commandes.
CREATE DATABASE 'instapics'; UTILISEZ 'instapics'; CREATE TABLE 'instapics'. 'Users' ('id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 'email' VARCHAR (100) NOT NULL, 'mot de passe' VARCHAR (100) NOT NULL, 'created_at' DATETIME NOT NULL, 'updated_at', DATETIME NOT NULL, PRIMARY KEY ('id'), INDEX UNIQUE 'Index_email' ('email')) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE TABLE 'instapics'. 'User_profiles' ('id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 'user_id' INTEGER UNSIGNED NOT NULL, 'nom' TEXT NOT NULL, 'profile_photo' TEXT NOT NULL, PRIMARY KEY ('id', UNIQUE INDEX 'Index_user_id' ('user_id'), CONSTRAINT 'FK_user_profiles_user_id' FOREIGN KEY 'FK_user_profiles_user_id' CREATE TABLE 'instapics'. 'Relations' ('id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 'follower_id' INTEGER UNSIGNED NOT NULL, 'following_id' INTEGER UNSIGNED NOT NULL, 'created_at' DATETIME NOT NULL, 'updated_at', 'updated_at' et NULL, PRIMARY KEY ('id'), INDEX UNIQUE 'Index_follower_id_followed_id' ('suiveur_id', 'suivie_id'), CONTRAINT 'FK_relationships_follower_id', le résultat de la recherche est le résultat de la recherche CASCADE, CONSTRAINT 'FK_relationships_followed_id' FOREIGN KEY 'FK_relationships_followed_id' ('suivie_id') REFERENCES 'utilisateurs' ('id') SUR SUPPRIMER CASCADE SUR UPDATE CASCADE) ENGINE = InnoDB CHARACTER CLEF8gg CREATE TABLE 'instapics'. 'Photos' ('id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 'user_id' INTEGER UNSIGNED NOT NULL, 'location' TEXT NOT NULL, 'description' TEXT NOT NULL, 'created_at' DATETIME NOT NULL, 'updated_at 'DATETIME NOT NULL, PRIMARY KEY (' id '), CONSTRAINT' FK_photos_user_id 'FOREIGN KEY' FK_photos_user_id '(' user_id ') REFERENCES' utilisateurs '(' id ') ON DELETE CASCADE IN UPDATE CASCADE) MOTEUR = InnoDB CHARAC utf8_general_ci; CREATE TABLE 'instapics'. 'Photo_comments' ('id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 'user_id' INTEGER UNSIGNED NOT NULL, 'photo_id' INTEGER UNSIGNED NOT NULL, 'message' TEXT NOT NULL, 'created_at' DATETIME NULL, ' updated_at 'DATETIME NOT NULL, PRIMARY KEY (' id '), CONSTRAINT' FK_photo_comments_user_id 'FOREIGN KEY' FK_photo_comments_user_id ',' utiliser_id ')' REFERENCES '(' id ')' 'FK_photo_comments_photo_id' ('photo_id') REFERENCES 'photos' ('id') ON EFFACER LA CASCADE SUR LA MISE A JOUR CASCADE) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
Vous pouvez également utiliser les migrations, mais nous les passerons en revue dans une leçon future..
Avant de faire quoi que ce soit avec les modèles Laravel, nous devons configurer la configuration de la base de données de notre installation Laravel. Ouvrir application / config / database.php, pour trouver certains de ces paramètres:
vrai
enregistrera tous les temps d'interrogation SQL dans les journaux Laravel. Laissez ceci comme vrai
pour l'instant.PDO :: FETCH_CLASS
et devrait être laissé comme si.$ connexions
tableau juste en dessouspgsql
, sqlite
, mysql
ou sqlsrv
Redis
bibliothèque, vous pouvez configurer les informations du serveur ici.Pour les besoins de ce tutoriel, nous utiliserons MySQL. Votre database.php Le fichier devrait ressembler à ceci (j'ai supprimé les commentaires, mais ils devraient pouvoir être conservés):
return array ('profile' => true, 'fetch' => PDO :: FETCH_CLASS, 'default' => 'mysql', 'connections' => array ('mysql' => array ('driver' => 'mysql ',' host '=>' localhost ',' database '=>' instapics ',' username '=>' root ',' password '=>' (votre mot de passe) ',' charset '=>' utf8 ',' prefix '=> ",),),' redis '=> array (' default '=> array (' host '=>' 127.0.0.1 ',' port '=> 6379,' database '=> 0), ));
Commencez par créer un modèle Laravel à l’intérieur du application / modèles dossier. Créer user.php à l'intérieur, et ajoutez le code suivant:
La classe User étend Eloquent
Maintenant, sur la base de notre examen de ce que le Utilisateur
Les relations sont, nous devons coder les méthodes de relation pour chacun d'eux:
class User étend Eloquent // en définissant $ timestamp sur true afin que Eloquent // définisse automatiquement les valeurs created_at // et updated_at public static $ $ timestamps = true; fonction publique user_profile () return $ this-> has_one ('User_Profile'); public function followers () return $ this-> has_many_and_belongs_to ('Utilisateur', 'relations', 'suivi_id', 'suiveur_id'); fonction publique following () return $ this-> has_many_and_belongs_to ('Utilisateur', 'relations', 'id_du_procédé', 'id_succédé'); photos de fonction publique () return $ this-> has_many ('Photo'); fonction publique photo_comment () return $ this-> has_many ('Photo_Comment');
De manière remarquable, nous utilisons ici certaines fonctionnalités avancées Plusieurs-à-Plusieurs, en raison de la structure de table de notre modèle suiveur (c’est-à-dire le utilisateurs
le tableau fait référence à la des relations
tableau qui référence le utilisateurs
table à nouveau). le has_many_and_belongs_to
function a la signature de méthode suivante:
/ ** * Récupère la requête pour une relation plusieurs à plusieurs. * * @param string $ modèle * @param string $ table * @param chaîne $ foreign * @param chaîne $ other * @return Relation * / fonction publique has_many_and_belongs_to ($ model, $ table = null, $ foreign = null, $ other = null)
Cela nous permet en fait de créer un modèle qui entretient une relation plusieurs à plusieurs avec lui-même (les utilisateurs suivent les autres utilisateurs). Nous utilisons suiveurs
et Suivant
noms de méthodes sur le Utilisateur
modèle pour nous permettre d’obtenir les abonnés d’un utilisateur ou tous les utilisateurs qu’un seul utilisateur suit, respectivement.
Suivant le Utilisateur
modèle, créez les autres modèles. Lorsque vous avez terminé, vous devriez avoir:
Ces fichiers seront dans le référentiel Git du tutoriel. Si vous préférez les télécharger, vous pouvez les trouver ici: https://github.com/nikkobautista/laravel-tutorial
Commençons par utiliser nos modèles en créant certaines des fonctions utilisateur dont nous aurons besoin dans l'application. Tout d'abord: l'enregistrement de l'utilisateur. À partir du tutoriel précédent, nous avons déjà créé un Formulaire d'inscription / connexion sur la page d'accueil. Pour le moment, cela ne fait rien, mais relions-le à un Utilisateur
manette, authentifier
action. Créer application / controllers / user.php avec le code suivant:
class User_Controller étend Base_Controller fonction publique action_authenticate ()
Ouvrir application / views / home / index.blade.php et cherchez le formulaire de connexion. Mettre à jour le formulaire sur Ligne 18 soumettre à la action_authenticate ()
méthode: