2009-07-29 5 views
2

Je suis relativement nouveau à CakePHP, et j'écris une application CakePHP qui a actuellement un modèle d'auteur et un modèle de livre. Auteur et livre ont tous deux une relation plusieurs-à-plusieurs.
Cependant, je voudrais aussi, pour chaque relation auteur-livre, avoir un lien correspondant vers le blog de cet auteur où ils réfléchissent à leurs expériences d'écriture de ce livre.CakePHP Plusieurs-à-plusieurs par relation Données supplémentaires

Si cela était source de confusion, les paragraphes qui suivent tentent d'élaborer pour rendre ma situation plus claire:

Pour chaque auteur, il y aura un article sur leur expérience pour chaque livre. Regarder cette relation à l'envers, cela signifie que pour chaque livre, il y aura un lien correspondant, par auteur (étant donné que les livres peuvent avoir plusieurs auteurs), où cet auteur décrit son expérience d'écriture du livre. En d'autres termes, pour chaque paire (auteur, livre), j'aimerais pouvoir stocker une URL associée. Dans des termes mathématiques plus fantaisistes et abstraits que j'utiliserai horriblement et incorrectement: j'ai un graphique non orienté, où chaque sommet est un auteur ou un livre, et chaque bord a un auteur pour un sommet et un livre pour l'autre . Cela semble confus, mais (je pense) il décrit ma situation aussi précisément que je peux le faire.
Étant donné la description ci-dessus, je veux savoir si je peux attacher des données arbitraires à un bord donné de cette relation, et le récupérer plus tard.

Actuellement, j'ai un troisième modèle, AuthorBook, qui agit sur le bord du graphique.
Auteur a une relation hasMany à AuthorBook.
Book a une relation hasMany avec AuthorBook.
AuthorBook a une relation belongsTo avec Author et Book, et possède en plus un champ url.

Cette solution fonctionne, mais pour une raison quelconque, le fait que Book ne soit pas directement connecté à Author me dérange. Est-il possible d'obtenir ce même effet tout en coupant le modèle AuthorBook hors de l'image?

(Aussi, je me rends compte que je peux les avoir directement liés tout en gardant AuthorBook, mais qui semble laid et aussi redondant.)

(Aussi, je me rends compte que j'aurais encore une table SQL author_book. Cela ne dérange moi le moins du monde, je pense qu'il est impossible de se passer de toute façon.)

Merci de votre temps! Et s'il te plaît, ne me brûle pas !!!

Répondre

6

Oui, vous pouvez modéliser la relation AuthorBook (ou le 'bord' tel que vous l'envisagez).

class Author extends AppModel { 
    ... 
    $hasAndBelongsToMany = array('Book', array('with' => 'AuthorBook')); 
    .... 
} 

Le "with" option HABTM:

Définit le nom du modèle pour la table de jointure. Par défaut, CakePHP créera automatiquement un modèle pour vous. En utilisant l'exemple ci-dessus, il s'appellera RecipesTag. En utilisant cette clé, vous pouvez remplacer ce nom par défaut. Le modèle de table de jointure peut être utilisé comme n'importe quel modèle "régulier" pour accéder directement à la table de jointure.

Ceci est l'équivalent de RoR de « through », décrit assez bien dans this illustration

+0

Je crois que vous pouvez accéder au modèle « avec » en utilisant Enchaînement du modèle ('$ this-> Book-> AuthorBook' ou' $ this-> Author-> AuthorBook') sans avoir besoin de ces relations supplémentaires. De plus, vous devriez pouvoir enregistrer dans la table de jointure en utilisant saveAll avec une clé '['AuthorBook']' dans votre tableau ('$ this-> Book-> saveAll()' ou '$ this-> Author-> saveAll() '). – deizel

Questions connexes