Projet

Général

Profil

Actions

Propel relations » Historique » Révision 1

Révision 1/3 | Suivant »
Anonyme, 31/12/2008 11:46
Le texte proposé par google-traduction. A retravailler sur toute la ligne.


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

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" type="VARCHAR" size="100" required="true"/>
<column name="author_id" type="INTEGER" required="true"/>
<foreign-key foreignTable="author">
<référence
local = "author_id"
étrangers = "author_id" />
</ foreign-key>
</ table>
&lt;table name="author"&gt;
&lt;column name="author_id" type="INTEGER" required="true" primaryKey="true"/&gt;
&lt;column name="fullname" type="VARCHAR" size="40" required="true"/&gt;
</ 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
&lt;table name="bookstore_employee" description="Employees d'un bookstore"&gt;
&lt;colonne
Name = "id"
Type = "integer"
PrimaryKey = "true"
AutoIncrement = "true"
Description = "Employee ID nombre" />
&lt;Colonne
Name = "nom"
Type = "VARCHAR"
Size = "32"
Description = "Nom de l'employé" />
</ table>
&lt;table name="bookstore_employee_account" description="Bookstore employees' login credentials"&gt; 
&lt;Colonne
Name = "employee_id"
Type = "integer"
PrimaryKey = "true"
Description = "clé primaire pour"
/>
&lt;Colonne
Name = "login"
Type = "VARCHAR"
Size = "32" />
&lt;Colonne
Name = "mot de passe"
Type = "VARCHAR"
Size = "100" />
&lt;foreign-key foreignTable="bookstore_employee" onDelete="cascade"&gt;
&lt;Référence Local="employee_id" foreign="id"/&gt;
</ 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
<? php
$ livres = BookPeer:: doSelect (nouveaux critères ()); 
foreach ($ $ livres livre) (
$ auteur = $ livre-> GetAuthor ();
)
)))
Le code ci-dessus se traduirait par l'exécution de 1 + n SQL, où n est le nombre de livres (et, par conséquent, nombre d'itérations de 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 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'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 *()''' 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
<? php
$ c = new 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');
= $ auteurs AuthorPeer:: doSelect ($ c); 
)))
... serait équivalent à:
((( 
#! sql
SELECT *
De l'auteur
INNER JOIN livre sur book.author_id = author.id
INNER JOIN éditeur sur publisher.id = book.publisher_id
OÙ publisher.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 &lt;foreign-key&gt; élément. Espérons que l'exemple fera la mise en œuvre (et de motivation pour cette fonctionnalité) clair:
((( 
#! xml
&lt;! - Test d'auto-référencement des clés étrangères et de l'héritage -&gt;
&lt;table name="bookstore_employee"&gt;
&lt;colonne
name = "id"
type = "integer"
PrimaryKey = "true"
autoIncrement = "true"
description = "Employee ID nombre" />
&lt;colonne
name = "nom"
type = "VARCHAR"
size = "32"
description = "Nom de l'employé" />
&lt;colonne
name = "job_title"
type = "VARCHAR"
size = "32"
description = "titre des employés au travail" />
&lt;colonne
name = "supervisor_id"
type = "integer"
description = "Fkey au superviseur." />
&lt;foreign-key = foreignTable "bookstore_employee"
phpName = "Superviseur"
refPhpName = "subordonné">
&lt;Référence local="supervisor_id" foreign="id"/&gt;
</ 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 &lt;foreign-key&gt;''''à 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
&lt;table name="review"&gt;
&lt;column name="review_id" type="INTEGER" primaryKey="true" required="true"/&gt;
&lt;column name="reviewer" type="VARCHAR" size="50" required="true"/&gt;
&lt;column name="book_id" required="true" type="INTEGER"/&gt;
&lt;foreign-key foreignTable="book" onDelete="CASCADE"&gt;
&lt;Référence local="book_id" foreign="book_id"/&gt;
</ foreign-key>
</ table>
)))
Dans l'exemple ci-dessus, l'examen''''les lignes seront automatiquement supprimés si les''livre''ligne est supprimé.

Mis à jour par il y a plus de 15 ans · 1 révisions