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 :
Une fois généré le modèle, les cardinalités indiquées dans le code sont correctes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Tout à coup, l'envie irrépressible me saisit : je veux encapsuler un formulaire sur les Images dans la page de gestion des catégories !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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')); }
Je prépare aussitôt l'objet Image de la façon la plus banale qui soit :
Et là, soudain, paf ! Le drame :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $img = new Image(); $img->setCategory($cat);
Face à cette injustice, je ne suis plus qu'un cri : Pourrrrrrrrrrrrrrrrrrrrrrquoiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ?Couldn't call Doctrine_Core::set(), second argument should be an instance of Doctrine_Collection when setting many-to-many references.
Hein ?
Partager