Nasıl Yinelenen Kayıtları Doktrin Collection izin verebilir

3 Cevap php

I'm hoping there are some fellow doctrine users out there.
Here is a simplified YAML of my relationships:

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

Ben bir koleksiyon aynı maddenin birçok kopyasını tutmak mümkün olmak istiyorum, ama çok gibi öğeleri yüklemek için oluşturulan sınıfları kullandığınızda:

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

$ Ürün benim çoğaltmaları içermiyor. Oluşturulan sql doğru yinelenen satırları dönmek gibi görünüyor:

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)

Ben bu benim yerine belirli dql sorgular hale etrafında alabilirsiniz biliyorum ama basit bir ayar öğeler koleksiyonu çoğaltmaları için izin orada bir yerde ise herkes biliyor mu?

3 Cevap

Eğer HYDRATE_SCALAR için hidrasyon modunu değiştirmek zorunda:

This hydration mode creates a flat/rectangular result set that can contain duplicate data.

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

(Ya da HYDRATE_NONE için)

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

denedin mi:

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

i hatırlayacak olursak doğru toplama-> Ürünleri $ it ArrayAccess / ArrayIterator uygulayan bir nesne, gerçek bir dizi değil

Doktrin olarak yinelenen nesneleri olamaz. Veritabanından alınan her nesnenin sadece bir kez Doktrini saklanır. Eğer aynı nesne için sorgu eğer iki kez bir işaretçi zaten vardı alınacağını aynı nesne alırsınız.

Sen nesne klonlama ve sizin Doctrine_Collection saklamak, ancak koleksiyonu kaydetmek zaman aslında veritabanında başka bir satır oluşturur.