Как я могу разрешить дубликаты записей в коллекции доктрин - PullRequest
1 голос
/ 14 февраля 2009

Я надеюсь, что там есть несколько друзей-учителей.
Вот упрощенный YAML моих отношений:

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

Я хочу, чтобы коллекция могла содержать много копий одного и того же элемента, но когда я использую сгенерированные классы для загрузки элементов, вот так:

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

$ элементы не содержат мои дубликаты. Кажется, что сгенерированный sql правильно возвращает повторяющиеся строки:

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)

Я знаю, что вместо этого я могу обойтись без выполнения моих конкретных запросов dql, но кто-нибудь знает, есть ли где-нибудь простая настройка, позволяющая коллекции Items иметь дубликаты?

Ответы [ 3 ]

2 голосов
/ 01 ноября 2009

Вы должны изменить режим гидратации на HYDRATE_SCALAR:

Этот режим гидратации создает плоский / прямоугольный набор результатов, который может содержать повторяющиеся данные.

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

(или HYDRATE_NONE)

как указано в http://www.doctrine -project.org / documents / manual / 1_1 / ru / работа с моделями # fetching-data

0 голосов
/ 30 апреля 2009

В Doctrine у ​​вас не может быть дубликатов объектов. Каждый объект, извлеченный из базы данных, сохраняется в Doctrine только один раз. Если вы дважды запросите один и тот же объект, вы получите указатель на тот же объект, который вы уже получили.

Вы можете клонировать объект и сохранить его в своем Doctrine_Collection, но это фактически создаст другую строку в базе данных при сохранении коллекции.

0 голосов
/ 17 марта 2009

вы пробовали:

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

если я правильно помню, $ collection-> Items - это не реальный массив, это объект, реализующий ArrayAccess / ArrayIterator

...