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 : 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
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
 
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
	$img = new Image();
	$img->setCategory($cat);
Et là, soudain, paf ! Le drame :
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 ?