Domanda

Spero ci sono alcuni utenti compagni di dottrina là fuori.
Ecco una YAML semplificata delle mie relazioni:

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

Voglio una collezione per essere in grado di tenere molte copie dello stesso elemento, ma quando uso le classi generate per caricare oggetti in questo modo:

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

$ articoli non contiene i miei duplicati. L'SQL generato sembra tornare correttamente le righe duplicate:

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)

So che posso ottenere intorno a questo mio fare query DQL specifici, invece, ma qualcuno sa se c'è qualche impostazione semplice per consentire l'insieme di elementi di avere duplicati?

È stato utile?

Soluzione

è necessario cambiare il modo di idratazione per HYDRATE_SCALAR:

  

Questa modalità crea un'idratazione   piatto set / rettangolare risultato che può   contengono i dati duplicati.

$res = $q->execute(array(), Doctrine::HYDRATE_SCALAR);

(o per HYDRATE_NONE)

come indicato nel http: //www.doctrine-project.org/documentation/manual/1_1/en/working-with-models#fetching-data

Altri suggerimenti

Hai provato:

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

Se ricordo bene $ Collezione> I prodotti che non è una vera e propria matrice è un oggetto che implementa ArrayAccess / ArrayIterator

In Dottrina non si può avere oggetti duplicati. Ogni oggetto recuperato dal database viene memorizzato una sola volta in Dottrina. Se si esegue una query per lo stesso oggetto due volte si otterrà un puntatore lo stesso oggetto si era già recuperato.

È possibile clonare l'oggetto e memorizzarlo nella Doctrine_Collection, ma che sarà effettivamente creare un'altra riga nel database quando si salva la collezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top