Pregunta

Estoy esperando que hay algunos usuarios compañero de doctrina por ahí.
Aquí es un YAML simplificada de mis relaciones:

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

Quiero una colección que sea capaz de mantener muchas copias del mismo elemento, pero cuando se utiliza las clases generadas para cargar artículos, así:

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

$ items no contiene mis duplicados. El SQL generado parece volver correctamente las filas duplicadas:

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)

Sé que puedo evitar esto mi hacer consultas DQL específicos lugar, pero ¿alguien sabe si hay algún lugar entorno sencillo para permitir la colección Items para tener duplicados?

¿Fue útil?

Solución

tiene que cambiar el modo de hidratación para HYDRATE_SCALAR:

  

Este modo crea una hidratación   conjunto de resultados plana / rectangulares que pueden   contienen datos duplicados.

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

(o a HYDRATE_NONE)

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

Otros consejos

¿trató:

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

Si no recuerdo mal $ colección-> Los productos que no es una matriz real, que es un objeto que implementa ArrayAccess / ArrayIterator

En la doctrina no se puede tener objetos duplicados. Cada objeto recuperado de la base de datos se almacena sólo una vez en la doctrina. Si se consulta para el mismo objeto dos veces obtendrá un puntero al mismo objeto que ya se había recuperado.

Puede clonar el objeto y almacenarlo en la Doctrine_Collection, pero que en realidad va a crear otra fila en la base de datos cuando se guarda la colección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top