embedForms 1:n avec table intermédiaire
Ladies and gentlemen,
Soit une gestion de catalogue simplifiée : j'ai des objets Category, Product, Image. Une catégorie ou un produit a 1:n images, une image n'appartient qu'à un seul élément de type donné (produit ou image).
Utiliser une relation 1:n classique en mettant la clé étrangère dans la table Image n'est pas satisfaisant ici car on ne sait pas quelle table va référencer cette clé étrangère.
C'est pourquoi une table intermédiaire est introduite : CategoryImage qui lie une image à sa catégorie, ProductImage qui lie une image à son produit.
Si on ne considère que le côté 'catégorie', cela nous donne un schéma (simplifié) comme ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| Category:
columns:
name:
type: string(45)
notnull: true
relations:
Images:
refClass: CategoryImage
class: Image
foreignType: one
CategoryImage:
columns:
image_id:
type: integer
primary: true
category_id:
type: integer
notnull: true
Image:
columns:
file_name:
type: string(255)
notnull: true
unique: true |
Une fois généré le modèle, les cardinalités indiquées dans le code sont correctes :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
BaseCategory::setUp() {
$this->hasMany('Image as Images', array(
'refClass' => 'CategoryImage',
'local' => 'category_id',
'foreign' => 'image_id'));
}
BaseImage::setUp() {
$this->hasOne('Category', array(
'refClass' => 'CategoryImage',
'local' => 'image_id',
'foreign' => 'category_id'));
} |
Tout à coup, l'envie irrépressible me saisit : je veux encapsuler un formulaire sur les Images dans la page de gestion des catégories !
Je prépare aussitôt l'objet Image de la façon la plus banale qui soit :
Code:
1 2
| $img = new Image();
$img->setCategory($cat); |
Et là, soudain, paf ! Le drame :
Citation:
Couldn't call Doctrine_Core::set(), second argument should be an instance of Doctrine_Collection when setting many-to-many references.
Face à cette injustice, je ne suis plus qu'un cri : Pourrrrrrrrrrrrrrrrrrrrrrquoiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ?
Hein ?