Projet

Général

Profil

Propel crud » Historique » Révision 3

Révision 2 (Anonyme, 01/01/2009 14:03) → Révision 3/6 (Anonyme, 03/01/2009 09:23)

''Ceci est une traduction libre de la page officielle de la documentation de Propel [http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/BasicCRUD /ICI]'' 

  = Base C.R.U.D. Opérations de base : C.R.U.D. (create, read, update, delete) =  

  Ce guide tente de va vous montrer comment effectuer les opérations de base CRUD (Créer, récupérer, UPDATE, DELETE) sur la votre base de données en utilisant Propel. 

  Par souci de cohérence, nous allons utiliser la librairie simplifié exemple modèle de données du Guide de démarrage rapide.  

  Les exemples qui suivent supposent dans ce guide suppose que vous avez déjà installé et paramétré Propel.  

  == CREATE ==  

  Pour ajouter de nouvelles données dans la base, base de données, il faut instancier un des objets générés par Propel et ensuite appeler la méthode setChamp() appropriée. Propel générera le SQL qui va bien pour faire l'insertion.  

  === Simple INSERT === 

  Dans sa forme la plus simple, on crée un nouveau tuple de cette façon :  


 {{{ 
 # php  
  / * Initialiser Propel, etc * /  

  $user $ author = new Utilisateur(); Author ();  
  $user->setPrenom("Thomas"); $ author-> setFirstName ( "Jack");  
  $user->setNom("Belliard"); $ author-> setLastName ( "London");  
  $user->save(); $ author-> save (); 
 }}} 
 
 Propel va traduire ces lignes de code par : 

 {{{ 
 #! sql  
  INSERT INTO utilisateurs auteur (prenom, nom) VALUES ('Thomas', 'Belliard'); ( 'Jack', 'London'); 
 }}} 


  === Gérer les insertions connexes ===  

  De plus, Propel sait si un objet a été sauvegardé ou pas. Donc on peut créer plusiers tuples de plusieurs tables différents et tout sauvegarder une seule fois : 

 {{{ 
  #! php  
  / * Initialiser Propel, etc * /  

  // / / 1) Créer un Auteur 

  (rangée de 'auteur' tableau)  

  include_once 'librairie/Author.php'; 'librairie / Author.php';  

  $author $ author = new Author(); Author ();  
  $author->setFirstName("Leo"); $ author-> setFirstName ( "Leo");  
  $author->setLastName("Tolstoï"); $ author-> setLastName ( "Tolstoï");  
  // / / Note: ce tuple n'est pas encore dans la base 

  // / / 2) Créer un Editeur 

  (ligne de "éditeur" tableau)  

  include_once 'librairie/Publisher.php'; 'librairie / Publisher.php';  

  $pub $ pub = new Editeur(); Editeur ();  
  $pub->setName("Viking $ pub-> setName ( "Viking Press");  
  // / / Note: ce tuple n'est pas encore dans la base  

  // / / 3) Créer un livre 

  (ligne de "livre" tableau)  

  include_once 'librairie/Book.php'; 'librairie / Book.php';  

  $livre $ livre = new livre(); livre ();  
  $livre->setTitle("Guerre $ livre-> setTitle ( "Guerre et Paix");  
  $livre->setIsbn("0140444173"); $ livre-> setIsbn ( "0140444173");  
  $livre->setPublisher($pub); $ livre-> setPublisher ($ pub);  
  $livre->setAuthor($author); $ livre-> setAuthor ($ author);  
  $livre->save(); 
  // $ livre-> save (); / / enregistre l'ensemble des 3 objets dans la base avec les dépendances (clés étrangères) qui vont bien !  
 }}} 

  Parce que Propel sait si un objet a été enregistré ou non, il est capable avec save() save () d'analyser tous les objets avant de les ajouter en gérant les relations à l'objet livre. (Plus d'info à ce sujet sur le site de Propel : [http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/Relationships Relationships]) . 

  == RETRIEVE == 

  Récupérer des objets de la base de données, également dénommés ''objets''hydratant, dénommé''objets''hydratant, comme quand on effectue une requête SELECT pour peupler toutes les propriétés de l'objet peut se faire à l'aide des méthodes statiques PEER pour vérifier si ces enregistrements existent dans la table. Ces CEs classes PEER ne contiennent que des méthodes statiques qui permettent d'effectuer des opérations sur la table. 
 Il existe plusieurs méthodes pour vous aider à choisir un seul ou plusieurs objets de la base de données.  

  === Récupération par la clé primaire ===  

  La façon la plus simple pour récupérer un objet (ligne) de la base de données, est d'utiliser la méthode ''retrieveByPK()''. Comme d'habitude, il faut fournir la valeur de la clé primaire en argument à cette méthode. 

  ==== La clé primaire est sur une seul colonne Unique PK-colonel ====  

  Habituellement, votre table aura une seule clé primaire, ce qui signifie que la méthode ''retrieveByPK()'' accepte un seul paramètre.  

 {{{ 
  #! php  

   


  $firstBook = BookPeer::retrieveByPK(1); BookPeer::retrieveByPK (1);  
  // $firstBook est maintenant est un objet livre, ou NULL si aucune correspondance n'a été trouvée.  
 }}} 

  ==== La clé primaire est sur plusieurs colonnes Multi-colonel PK ====  

  Dans certains cas, votre clé primaire est composée de plusieurs colonnes. Dans ce cas, ''retrieveByPK()'' acceptera sera créé pour accepter des paramètres multiples, un pour chaque colonne de clé primaire.  

  Par exemple, si nous avions un tableau, avec un multi-colonne de clé primaire, définie comme ceci:  
 {{{ 
  #! xml  
     <table name="multicolpk_example" phpName="MultiColPKExample">  
        <column name="id1" type="INTEGER" primaryKey="true"/>  
        <column name="id2" type="INTEGER" primaryKey="true"/>  
        <! - Les autres colonnes ... ->  
     </ table>  
 }}} 

  ... alors votre méthode retrieveByPK()'' serait invoquée comme ceci:  

 {{{ 
  #! php  

  $myObject = MultiColPKExamplePeer::retrieveByPK(1,2); MultiColPKExamplePeer::retrieveByPK (1,2);  
 }}} 

  ==== Obtenir plusieurs objets par PK ====  

  Vous pouvez également sélectionner plusieurs objets en fonction de leurs clés primaires, en appelant la méthode générée ''retrieveByPKs()'' le généré retrieveByPKs''()''méthode, qui prend en paramètre un tableau de clés primaires:  

 {{{ 
  #! php  

  $selectedBooks = BookPeer::retrieveByPKs(array(1,2,3,4,5,6,7)); BookPeer::retrieveByPKs(array (1,2,3,4,5,6,7)); 
  // $SelectedBooks $ SelectedBooks est un tableau d'objets 
 Réservez  
 }}} 

  ''Il est à noter que ceci ne fonctionne que pour les tables avec une seule colonne de clés primaires.''  

  === Interrogation de la base de données ===  

  Pour sélectionner plusieurs lignes par d'autres des critères autres que la clé primaire, nous avons deux choix:[[BR]] 
  1) d'utiliser la classe Criteria, ou[[BR]] 
  2) d'écrire du SQL personnalisé.[[BR]] 
  personnalisé. La classe ''Criteria'' offre une approche relativement simple à la construction d'une requête. C'est le meilleur la base de données logique de neutralité et de simplicité en faire un bon choix pour construire des requêtes simples dans la base, l'expression d'un grand nombre de requêtes, mais pour une requête très complexe, il peut elle mai s'avérer plus efficace (et moins douloureux) de douloureuses) à simplement utiliser une requête SQL personnalisée pour peupler (hydrate) à hydrater votre objet Propel. Propel objets.  

  ==== Critères simples ====  

  Voici quelques exemples de critères simples être utilisé pour renvoyer plusieurs objets.  

  '' 'Exemple 1:''' Trouver tous les auteurs dont le    prenom est Thomas, Karl, mais dont le nom n'est pas Belliard. Marx.  

 {{{ 
  #! php  

  $c = new Criteria();  
  $c->add(UtilisateurPeer::prenom, "Thomas"); $c->add(AuthorPeer::FIRST_NAME, "Karl");  
  $c->add(UtilisateurPeer::nom, "Belliard", $c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);  

  $users $auteurs = UtilisateurPeer::doSelect($c); AuthorPeer::doSelect($c);  
  // $users $auteurs contient un tableau des auteurs de tous les utilisateurs qui répondent à la requête  
  // {Trad} --> On voit ici toute l'utilité d'utiliser un IDE pour coder avec l'autocomplétion. 
 l'auteur objets  
 }}} 

  ... on obtient les mêmes résultats qu'avec la requête SQL suivante:  
 {{{  
  #! sql  
  SELECT * ... FROM utilisateurs author WHERE utilisateurs.prenom author.FIRST_NAME = 'Thomas' 'Karl' AND utilisateurs.nom author.LAST_NAME <> 'Belliard'; 'Marx'; 

 }}} 

  '''Exemple '' 'Exemple 2:''' Trouver tous les auteurs dont le nom est Tolstoy, Dostoevsky, ou Bakhtin 

 {{{ 
  #! php  

 $c = new Criteria(); 
 $c->add(AuthorPeer::LAST_NAME, array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN); 

 $authors = AuthorPeer::doSelect($c); 

  // $authors contient un tableau des objets auteurs 
 }}} 

  ... on obtient les mêmes résultats qu'avec la requête SQL suivante:  
 {{{ 
  #! sql  
  SELECT ... FROM author WHERE author.LAST_NAME IN ('Tolstoy', 'Dostoevsky', 'Bakhtin'); 
 
 }}} 



 === Utiliser des critères complexes === 

  

 = J'en suis ICI, IL FAUT ENCORE FINIR DE TRADUIRE VRAIMENT = 


  Logiquement ==== ==== Complexe Critères  

  Quand vous avez besoin d'exprimer des relations logiques (ET, OU, etc) dans la clause where entre les différents critères de la requête, clauses, vous devez combiner manuellement chaque objet Criteria() Critère''''objets ensemble. Ces clauses Le critère''''les objets sont ensuite les composants qui sont assemblés en toute transparence les critères''''objet lorsque vous utilisez les critères''-> ajouter à la requête par la méthode ''Criteria->add()''. 

  '''Exemple ()''méthode.  

  '' 'Exemple 1:''' Trouver tous les auteurs dont avec le prénom est premier nom de "Leo" et ou le dernier nom est "Tolstoy", "Dostoevsky", "Bakhtin".  

 {{{ 
  de "Tolstoï", "Dostoïevski", ou "Bakhtine"  

  (((  
  #! php 

 $c  
  <? php  

  $ c = new Criteria(); 
 $cton1 de nouveaux critères ();  
  cton1 $ = $c->getNewCriterion(AuthorPeer::FIRST_NAME, "Leo"); 
 $cton2 $ c-> getNewCriterion (AuthorPeer:: first_name, "Léon");  
  cton2 $ = $c->getNewCriterion(AuthorPeer::LAST_NAME,    array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN); 
 
 // On combine toutes ces clauses... 
 $cton1->addOr($cton2); 
 
 // ...qu'on ajoute au critère (sic), à la requête quoi ;) 
 $c->add($cton1); 

 
 }}} 

  $ c-> getNewCriterion (AuthorPeer:: nom, array ( "Tolstoï", "Dostoïevski", "Bakhtine"), Critères:: IN);  
 
  / / Les combiner  
  $ cton1-> Addor ($ cton2);  
 
  / / Ajouter les critères  
  $ c-> add ($ cton1);  
  )))  

  ... résultats dans la requête SQL comme:  
 {{{ 
   
  (((  
  #! sql  
  SELECT ... FROM author De l'auteur WHERE (author.FIRST_NAME = 'Leo' OR OU DANS author.LAST_NAME IN ('Tolstoy', 'Dostoevsky', 'Bakhtin')); 
 }}} 

 = J'ai un peu avancé, j'en suis ici ;) = 

  ( «Tolstoï», «Dostoïevski», «Bakhtine '));  
  )))  

  Il ya aussi des''critères''raccourcis si vous souhaitez effectuer une requête avec les relations logiques entre les clauses de référence que''la même colonne''.  

  '' 'Exemple 2:''' Trouver tous les auteurs avec le premier nom de «Leo» ou «Karl»  

  Utiliser Critère verbose''approche'', cela ressemble à:  
  (((  
  #! php  
  <? php  

  $ c = de nouveaux critères ();  
  cton1 $ = $ c-> getNewCriterion (AuthorPeer:: first_name, "Léon");  
  cton2 $ = $ c-> getNewCriterion (AuthorPeer:: first_name, "Karl");  
 
  / / Les combiner  
  $ cton1-> Addor ($ cton2);  
 
  / / Ajouter les critères  
  $ c-> add ($ cton1);  
  )))  

  En utilisant un raccourci''''méthodes Critères:  
  (((  
  #! php  
  <? php  

  $ c = de nouveaux critères ();  
  $ c-> ajouter (AuthorPeer:: first_name, "Léon");  
  $ c-> Addor (AuthorPeer:: first_name, "Karl");  
  )))  

  Il est important de noter que ces critères sténographie''''méthodes ont un certain nombre de limites - surtout qu'ils ne fonctionne que pour les relations seule colonne. De l'auteur, il est conseillé de ne pas utiliser ces méthodes lorsque vous avez besoin d'exprimer les relations entre logique clause car ils masquent le réel entre les relationsihps Critère''et''objets peuvent facilement conduire à difficiles à déboguer les problèmes de génération de requête. (Ces méthodes vont probablement changer ou disparaître dans Propel 2).  

  Utiliser ==== ==== SQL personnalisé  

  Propel est conçu pour travailler avec vous plutôt que contre vous. Dans de nombreux cas, la rédaction d'un complexe requête en utilisant les critères''''finit par être vraiment désordre et encore moins intelligible ou à maintenir un niveau de requête SQL. Propel a été créé pour travailler les limites inhérentes d'une base de données''neutre''système de critères en la rendant facile pour vous d'utiliser vos propres requêtes SQL pour les ensembles de résultats hydrate.  

  Ainsi, avec seulement un peu plus de travail, vous pouvez également obtenir des objets de votre base de données en utilisant SQL. Utiliser SQL pour interroger la base de données nous introduit à la populateObjects généré''()''méthode dans notre classes Peer - qui est appelé dans les coulisses par la doSelect''()''méthode. Cette méthode attend d'être adopté une créole''!''Objet ResultSet, indexé numériquement (c'est-à-dire qui a été créé à l'aide! ResultSet:: FETCHMODE_NUM option''à executeQuery ()'').  

  '' 'Exemple 1:''' Utilisez des sous-sélectionne pour peupler la base de données  

  (((  
  #! php  
  <? php  

  $ con = Propel:: getConnection (database_name);  

  $ sql = "SELECT .* livres des livres lorsqu'ils ne sont pas EXISTS (SELECT id de l'examen OÙ book_id = book.id)";  
  $ stmt = $ con-> prepare ($ sql);  
  $ stmt-> execute ();  

  $ livres = BookPeer:: populateObjects ($ stmt);  
  )))  

  Des choses importantes à retenir lorsque vous utilisez SQL personnalisé pour remplir Propel:  
    *! ResultSet colonne doit être indexé numériquement  
    *! ResultSet doit contenir toutes les colonnes de l'objet  
    *! ResultSet doit avoir les colonnes''dans le même ordre'', telles qu'elles sont définies dans le (((schema.xml))) fichier  

  MISE À JOUR == ==  

  Mise à jour de la base de données comporte essentiellement des lignes de récupérer des objets, de modifier le contenu, puis les enregistrer. Dans la pratique, pour Propel, il s'agit d'une combinaison de ce que nous avons déjà vu dans le récupérer et créer des sections.  

  (((  
  #! php  
  <? php  

  / / 1) Récupère un objet de clé primaire  

  = $ myBook BookPeer:: retrieveByPK (1);  

  / / 2) de mettre à jour les valeurs et save ().  

  myBook $ -> setTitle ( "Guerre et Paix");  
  $ myBook-> save ();  
  )))  

  Il n'y a vraiment pas grand-chose de bien plus que cela. Bien sûr, vous pouvez également mettre à jour les relations d'une manière similaire à ce qui a déjà été démontré dans la section CREATE.  

  (((  
  #! php  
  <? php  
  / * Initialiser Propel, etc * /  

  / / 1) Auteur de récupérer une  
  $ auteur = AuthorPeer:: retrieveByPK (1);  

  / / 2) récupérer un livre  
  $ livre = BookPeer:: retrieveByPK (1);  

  / / 3) maintenant aveuglément set $ auteur que l'auteur de livre $!  

  $ livre-> setAuthor ($ author);  
  $ livre-> save ();  
  )))  

  == == DELETE  

  Suppression d'objets peut être accompli en utilisant les classes Peer ou l'objet classes.  

  === === L'aide par les pairs  

  Vous pouvez utiliser les produits doDelete''()''de la méthode générée par les pairs des classes à supprimer des lignes de vos tables. Vous pouvez passer cette méthode une clé primaire, une instance de l'objet, ou même un objet de critères (mais ce n'est pas très utile, puisque vous ne pouvez supprimer que par la clé primaire).  

  '' 'Exemple 1:''' Supprimer l'aide de la clé primaire  

  (((  
  #! php  
  <? php  

  BookPeer:: doDelete (1);  
  )))  

  '' 'Exemple 2:''' Supprimer l'aide de l'objet instancié  

  (((  
  #! php  
  <? php  

  $ livre = BookPeer:: retrieveByPK (1);  
  BookPeer:: doDelete ($ livre);  
  )))  

  L'aide d'objets === ===  

  Par souci de cohérence avec d'autres C.R.U.D. opérations, vous pouvez également supprimer la ligne d'une base de données à l'aide de la classe d'objets. Certaines personnes préfèrent le faire de cette façon, l'instanciation d'un objet, puis appeler la''delete ()''méthode sur celle-ci. D'autres estiment que cela est "bizarre", car alors vous êtes à gauche avec un objet qui ne fait point à la ligne une base de données. Quel que soit - vous êtes libre de choisir:)  

  (((  
  #! php  
  $ livre = BookPeer:: retrieveByPK (1);  
  $ livre-> delete ();  
  / / (Et maintenant vous devez vous rappeler que vous ne pouvez plus utiliser l'objet $ livre)  
  )))