Wie kann ich doppelten Datensätze in einer Lehre Sammlung ermöglichen
Frage
Ich hoffe, es gibt einige Kolleginnen und Lehre Nutzer da draußen.
Hier ist ein vereinfachtes YAML meiner Beziehungen:
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
Ich möchte eine Sammlung der Lage sein, viele Kopien des gleichen Titel zu besitzen, aber wenn ich die generierten Klassen verwenden, um Elemente zu laden, etwa so:
$collection = Doctrine::getTable('Collection')->find(1);
$items = $collection->Items;
$ items enthält nicht meine Duplikate. Die erzeugte SQL scheint korrekt doppelte Zeilen zurück:
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)
Ich weiß, dass ich um diese spezifische dql Abfragen meine macht stattdessen bekommen kann, aber weiß jemand, ob es irgendwo einfache Einstellung ist die Items-Auflistung, damit Duplikate haben?
Lösung
Sie müssen zu HYDRATE_SCALAR den Trink-Modus ändern:
Diese Trink Modus erzeugt ein flach / rechteckiger Ergebnismenge, die Dose doppelte Daten enthalten.
$res = $q->execute(array(), Doctrine::HYDRATE_SCALAR);
(oder HYDRATE_NONE)
wie in http: //www.doctrine-project.org/documentation/manual/1_1/en/working-with-models#fetching-data
Andere Tipps
haben Sie versucht:
foreach($collection->Items as $item)
{
// do something with $item
}
Wenn ich das richtig Sammlungs- $> Produkte erinnern ist kein echtes Array ist es ein Ziel der Umsetzung Arrayaccess / ArrayIterator
In Lehre können Sie keine doppelten Objekte. Jedes Objekt aus der Datenbank abgerufen wird nur einmal in Lehre gespeichert. Wenn Sie für das gleiche Objekt abfragen zweimal werden Sie einen Zeiger das das gleiche Objekt erhalten hatten Sie bereits abgerufen.
Sie können das Objekt klonen und speichern Sie es in Ihrem Doctrine_Collection
, aber das wird tatsächlich eine andere Zeile in der Datenbank erstellen, wenn Sie die Sammlung speichern.