2009-02-14 3 views
1

J'espère que d'autres utilisateurs de doctrine seront disponibles.
Voici une YAML simplifiée de mes relations:Comment puis-je autoriser les enregistrements en double dans une collection de doctrine?

Collection: 
    columns: 
    id:   { type: integer(4), notnull: true, primary: true, autoincrement: true } 
    name:   { type: string(255), notnull: true, unique: true } 
    relations: 
    Items: 
     class: Item 
     refClass: CollectionItem 
     foreignAlias: Collections 
     type: many 
     foreignType: many 

Item: 
    columns: 
    id: { type: integer(4), notnull: true, primary: true, autoincrement: true } 
    name: { type: string(255), notnull: true } 

CollectionItem: 
    columns: 
    id:  { type: integer(4), notnull: true, primary: true, autoincrement: true } 
    collection_id: { type: integer(4) } 
    item_id: { type: integer(4) } 
    relations: 
    Collection: 
     foreignAlias: CollectionItem 
     foreignType: one 
    Item: 
     foreignAlias: CollectionItem 
     foreignType: one 

Je veux une collection pour pouvoir contenir plusieurs exemplaires du même article, mais quand j'utilise les classes générées pour charger des articles comme ceci:

$collection = Doctrine::getTable('Collection')->find(1); 
$items = $collection->Items; 

$ articles ne contient pas mes doublons. Le SQL généré semble revenir correctement les lignes en double:

SELECT i.id AS i__id, i.name AS i__name, c.id AS c__id, c.collection_id AS c__collection_id, c.item_id AS c__item_id, FROM item i LEFT JOIN collection_item c ON i.id = c.item_id WHERE c.collection_id IN (?) - (1) 

Je sais que je peux contourner ce que je fasse des requêtes DQL spécifiques au lieu, mais que quelqu'un sait s'il est simple réglage quelque part pour permettre la collection Items d'avoir des doublons?

Répondre

0

avez-vous essayé:

foreach($collection->Items as $item) 
{ 
    // do something with $item 
} 

si je me souviens bien collection- $> Articles n'est pas un tableau réel, il est un objet qui implémente ArrayAccess/ArrayIterator

0

Dans Doctrine vous ne pouvez pas avoir des objets en double . Chaque objet extrait de la base de données n'est stocké qu'une seule fois dans Doctrine. Si vous interrogez deux fois le même objet, vous obtiendrez un pointeur correspondant au même objet que vous avez déjà récupéré.

Vous pouvez cloner l'objet et le stocker dans votre Doctrine_Collection, mais cela créera en réalité une autre ligne dans la base de données lorsque vous enregistrez la collection.

Questions connexes