Come posso permettere record duplicati in una raccolta Doctrine
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?
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.