Actions
Ceci est une traduction libre de 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"> <reference local="author_id" foreign="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>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 bookstore"> <column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" description="Employee ID number"/> <column name="name" type="VARCHAR" size="32" description="Employee name"/> </table> <table name="bookstore_employee_account" description="Bookstore employees' login credentials"> <column name="employee_id" type="INTEGER" primaryKey="true" description="Primary key for " /> <column name="login" type="VARCHAR" size="32"/> <column name="password" type="VARCHAR" size="100"/> <foreign-key foreignTable="bookstore_employee" onDelete="cascade"> <reference local="employee_id" foreign="id"/> </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 = [[BookPeer]]::doSelect(new Criteria()); foreach($books as $book) { $author = $book->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 $ 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 page sur les relations Many-to-Many pour plus d'infos à ce sujet. 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 $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 = [[AuthorPeer]]::doSelect($c);... serait équivalent à:
#! sql SELECT * FROM author INNER JOIN book ON book.author_id = author.id INNER JOIN publisher ON publisher.id = book.publisher_id WHERE publisher.name = 'Some Name'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--> <table name="bookstore_employee"> <column 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."/> <foreign-key foreignTable="bookstore_employee" phpName="Supervisor" refPhpName="Subordinate"> <reference local="supervisor_id" foreign="id"/> </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 local="book_id" foreign="book_id"/> </foreign-key> </table>Dans l'exemple ci-dessus, l'examen*'les lignes seront automatiquement supprimés si les_livre_ligne est supprimé.
Updated by almost 16 years ago · 3 revisions