Projet

Général

Profil

Propel relations » Historique » Révision 2

Révision 1 (Anonyme, 31/12/2008 11:46) → Révision 2/3 (Anonyme, 03/01/2009 16:26)

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

  = Propel 

 Les relations de base = 

  =  

  Soutien pour propulser les relations entre les objets des cartes directement à la façon que les bases de données de soutien des relations entre les tables en utilisant des clés étrangères. Relation de soutien dans Propel est donc facile à comprendre, mais il hérite aussi de certains de la simplicité de ce modèle, par exemple, Propel ne cache pas le fait que vous devez utiliser un système de références croisées, table pour plusieurs-vers-plusieurs rapports (voir la [wiki: Users/Documentation/1.3/ManyToManyRelationships Many-to-Many relations] page pour en savoir plus sur ce sujet).  

  == Définition des relations == 

  ==  

  Les relations sont spécifiées par la création des clés étrangères dans les''''<table> sections de votre (((schema.xml))) fichier. Vous utilisez le <foreign-key>''''tag à créer une relation entre une table et un autre, en utilisant le même principe de base que vous devez utiliser relatives à un tableau à l'autre au niveau de la base de données.  

  {{{ (((  
  #! xml  
  <table name="book"> 
   
   <column name="book_id" type="INTEGER" required="true" primaryKey="true"/> 
   
   <column name="title" NAME="title" type="VARCHAR" size="100" required="true"/> 
   
   <column name="author_id" type="INTEGER" required="true"/> 
   
   <foreign-key foreignTable="author"> 
    <reference local="author_id" foreign="author_id"/> 
  </foreign-key> 
 </table> 
  
     <référence  
       local = "author_id"  
       étrangers = "author_id" />  
   </ foreign-key>  
  </ table>  
  <table name="author"> 
   
   <column name="author_id" type="INTEGER" required="true" primaryKey="true"/> 
   
   <column name="fullname" type="VARCHAR" size="40" required="true"/> 
 </table> 

  }}} 

   
  </ table>  
  )))  

  Propel utilisera ces informations pour:  
   * Générer des FOREIGN KEY création SQL DDL dans votre fichier (par exemple, (((schema.sql)))) et  
   * Créer getter et setter méthodes dans votre généré objets (par exemple''livre''aura un GetAuthor''()''et''setAuthor ()''méthode)  

  === One-to-One relations ===  

  Propel 1.3 prend en charge cas particulier one-to-one relations (voir billet: 279). One-to-one relations sont définies lors de la clé primaire est également une clé étrangère. Par exemple (simplifié de la librairie schema.xml):  

  {{{ 
  (((  
  #! xml  
    
    <table name="bookstore_employee" description="Employees of a d'un bookstore"> 
         <column 
           name="id" 
           type="INTEGER" 
           primaryKey="true" 
           autoIncrement="true" 
           description="Employee  
          <colonne  
  Name = "id"  
  Type = "integer"  
  PrimaryKey = "true"  
  AutoIncrement = "true"  
  Description = "Employee ID number"/> 
         <column 
           name="name" 
           type="VARCHAR" 
           size="32" 
           description="Employee name"/> 
   </table> 

   nombre" />  
  <Colonne  
  Name = "nom"  
  Type = "VARCHAR"  
  Size = "32"  
  Description = "Nom de l'employé" />  
    </ table>  

    <table name="bookstore_employee_account" description="Bookstore employees' login credentials"> 
         <column 
           name="employee_id" 
           type="INTEGER" 
           primaryKey="true" 
           description="Primary key for " 
            
  <Colonne  
  Name = "employee_id"  
  Type = "integer"  
  PrimaryKey = "true"  
  Description = "clé primaire pour"  
  /> 
         <column 
           name="login" 
           type="VARCHAR" 
           size="32"/> 
         <column 
           name="password" 
           type="VARCHAR" 
           size="100"/> 
          
  <Colonne  
  Name = "login"  
  Type = "VARCHAR"  
  Size = "32" />  
  <Colonne  
  Name = "mot de passe"  
  Type = "VARCHAR"  
  Size = "100" />  
  <foreign-key foreignTable="bookstore_employee" onDelete="cascade"> 
           <reference local="employee_id"  
  <Référence Local="employee_id" foreign="id"/> 
         </foreign-key> 
   </table> 

  }}} 

   
  </ Foreign-key>  
    </ table>  
  )))  

  Parce que la clé primaire de la bookstore_employee_account''''est aussi une clé étrangère à la bookstore_employee''''table, Propel interprète cela comme un one-to-one relation et générer des méthodes singulières pour les deux parties de la relation - par exemple '' '! BookstoreEmployee-> getBookstoreEmployeeAccount ()''' et'''! BookstoreEmployeeAccount-> getBookstoreEmployee ()'''.  

  == Récupération des objets connexes ==  

  En utilisant l'exemple ci-dessus (sur la base du schéma prévu librairie), vous avez un''livre-> GetAuthor ()''qui retourne un''''Auteur objet en utilisant la clé étrangère.  

  {{{ (((  
  #! php  

 $books  
  <? php  

  $ livres = BookPeer::doSelect(new Criteria()); 
 foreach($books as $book) { 
  $author BookPeer:: doSelect (nouveaux critères ());  
  foreach ($ $ livres livre) (  
   $ auteur = $book->getAuthor(); 
 } 

  }}} 

  $ livre-> GetAuthor ();  
  )  
  )))  

  Le code ci-dessus se traduirait par l'exécution de 1+n 1 + n SQL, où n est le nombre de livres (et, par conséquent, nombre d'itérations de la boucle ''foreach''): la''''boucle foreach):  

    1. 1 x SELECT * FROM livre  
    1. nx SELECT * FROM auteur si author_id =''$ livre-> getAuthorId ()''  

  S'il est clair que cette méthode fonctionne, il n'est pas optimale pour exécuter cette deuxième requête pour chaque itération. Propel génère également des méthodes dans votre classe de base par les pairs pour aller chercher les deux auteur de livres et de l'information dans une seule requête en utilisant un LEFT JOIN * ^ ^.  

  {{{ (((  
  #! php  
  <? php  

  $ livres = BookPeer:: doSelectJoinAuthor (nouveaux critères ());  
  foreach ($ $ livres livre) (  
   $ auteur = $ livre-> GetAuthor ();  
  )  
  )))  

  }}} 

  Dans le cas ci-dessus, une seule requête est effectuée:  

    1. SELECT * FROM livre LEFT JOIN auteur sur author.author_id = book.author_id  

  Continuer la lecture de la [wiki: Users/Documentation/1.3/ManyToManyRelationships Many-to-Many relations] pour une page sur les relations [http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/ManyToManyRelationships Many-to-Many] de ce traitement plus avancé realtionship sujet.  

  ^ ^ * Notez que dans Propel 1.3 Le comportement a changé à partir de l'exercice INNER JOIN à l'aide de LEFT JOIN par défaut. S'il vous plaît voir wiki: Users/Documentation/1.3/Upgrading pour plus d'infos à ce sujet. 

  d'informations et des instructions sur la façon de garder l'original INNER JOIN problème si votre application dépend.  

  == Relations dans l'aide de critères ==  

  Vous pouvez créer des requêtes qui utilisent les relations en utilisant la commande '''doSelectJoin*()''' commande'' 'doSelectJoin *()''' méthodes ou par précisant explicitement s'associe à l'objet de critères (voir [wiki: Documentation/1.3/Criteria]).  

  Dans les deux cas, vous pouvez ajouter des expressions pour l'une des tables jointes aux critères de l'objet:  

 {{{ 
   

  (((  
  #! php  

 $c  
  <? php  

  $ c = new Criteria(AuthorPeer::DATABASE_NAME); 

 $c->addJoin(AuthorPeer::ID, BookPeer::AUTHOR_ID, Criteria::INNER_JOIN); 
 $c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::INNER_JOIN); 

 $c->add(PublisherPeer::NAME, 'Some Name'); 

 $authors critères (AuthorPeer:: database_name);  

  $ c-> addJoin (AuthorPeer:: ID, BookPeer:: author_id, Critères:: INNER_JOIN);  
  $ c-> addJoin (BookPeer:: PUBLISHER_ID, PublisherPeer:: ID, Critères:: INNER_JOIN);  

  $ c-> ajouter (PublisherPeer:: NOM, 'un nom');  

  = AuthorPeer::doSelect($c); 

 }}} 

  $ auteurs AuthorPeer:: doSelect ($ c);  
  )))  

  ... serait équivalent à:  

 {{{ 
   

  (((  
  #! sql  
  
  SELECT *  
 FROM author  
    
  De l'auteur  
    INNER JOIN book ON livre sur book.author_id = author.id  
    
    INNER JOIN publisher ON éditeur sur publisher.id = book.publisher_id 
 WHERE  publisher.name = 'Some Name' 

 }}} 


  'Certains Nom "  
  )))  


  == Primauté PHP noms pour les relations Getters / Setters ==  

  Comme de Propel 1.3 (voir billet: 23), il est possible de fournir des noms de PHP pour les méthodes qui sont créés pour la récupération de clé étrangère liée objets. Vous pouvez spécifier la clé étrangère phpName''''et''''refPhpName attributs dans la <foreign-key> élément. Espérons que l'exemple fera la mise en œuvre (et de motivation pour cette fonctionnalité) clair:  

 {{{ 
   

  (((  
  #! xml  
 <!-- test self-referencing foreign keys and inheritance--> 
    
  <! - Test d'auto-référencement des clés étrangères et de l'héritage ->  
    <table name="bookstore_employee"> 
         <column 
           name="id" 
           type="INTEGER" 
           primaryKey="true" 
           autoIncrement="true" 
           description="Employee  
          <colonne  
            name = "id"  
            type = "integer"  
            PrimaryKey = "true"  
            autoIncrement = "true"  
            description = "Employee ID number"/> 
         <column 
           name="name" 
           type="VARCHAR" 
           size="32" 
           description="Employee name"/> 
         <column 
           name="job_title" 
           type="VARCHAR" 
           size="32" 
           description="Employee job title"/> 
         <column 
           name="supervisor_id" 
           type="INTEGER" 
           description="Fkey to supervisor."/> 
         nombre" />  
          <colonne  
            name = "nom"  
            type = "VARCHAR"  
            size = "32"  
            description = "Nom de l'employé" />  
          <colonne  
            name = "job_title"  
            type = "VARCHAR"  
            size = "32"  
            description = "titre des employés au travail" />  
          <colonne  
            name = "supervisor_id"  
            type = "integer"  
            description = "Fkey au superviseur." />  
          <foreign-key foreignTable="bookstore_employee"  
                      phpName="Supervisor"  
                      refPhpName="Subordinate"> 
           <reference = foreignTable "bookstore_employee"  
                       phpName = "Superviseur"  
                       refPhpName = "subordonné">  
            <Référence local="supervisor_id" foreign="id"/> 
         </foreign-key> 
   </table> 

 }}} 

   
          </ foreign-key>  
    </ table>  
  )))  

  Ceci est un exemple d'un auto-référencement de table en librairie schema.xml.  

  Le''''phpName attribut affecte de nommage des méthodes comme'' 'setSupervisor ()''', alors que le''''refPhpName attribut affecte de nommage des méthodes qui travaillent avec les références des clés étrangères - par exemple '' 'addSubordinate ()''',''' getSubordinates ()'''.  

  == Sur-Mise à jour et sur Supprimer les déclencheurs ==  

  Propel soutient également la''''ON UPDATE et DELETE''sur''de l'aspect des clés étrangères. Ces propriétés peuvent être spécifiées dans le <foreign-key>''''à l'aide de la balise onUpdate''''et''''onDelete attributs. Propel soutient les valeurs de la "cascade", "SETNULL», et «RESTRICT» pour ces attributs. Pour les bases de données qui ont des clés étrangères de soutien, de déclencher ces événements seront précisées au niveau datbase l'étranger lorsque les clés sont créées. Pour les bases de données qui ne supportent pas les clés étrangères, cette fonctionnalité sera suivi par Propel.  

 {{{ 
   

  (((  
  #! xml  
  
  <table name="review"> 
   
   <column name="review_id" type="INTEGER" primaryKey="true" required="true"/> 
   
   <column name="reviewer" type="VARCHAR" size="50" required="true"/> 
   
   <column name="book_id" required="true" type="INTEGER"/> 
          
  <foreign-key foreignTable="book" onDelete="CASCADE"> 
    <reference  
     <Référence local="book_id" foreign="book_id"/> 
  </foreign-key>    
 </table> 

 }}} 

   
   </ foreign-key>  
  </ table>  
  )))  

  Dans l'exemple ci-dessus, l'examen''''les lignes seront automatiquement supprimés si les''livre''ligne est supprimé.