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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top