¿Cómo puedo permitir registros duplicados en una colección Doctrina
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?
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.