Как я могу разрешить повторяющиеся записи в коллекции Doctrine?

StackOverflow https://stackoverflow.com/questions/548346

  •  23-08-2019
  •  | 
  •  

Вопрос

Я надеюсь, что здесь найдутся другие пользователи доктрины.
Вот упрощенный 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;

$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 иметь дубликаты?

Это было полезно?

Решение

вам нужно изменить режим гидратации на HYDRATE_SCALAR:

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

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

(или в HYDRATE_NONE)

как сказано в http://www.doctrine-project.org/documentation/manual/1_1/en/working-with-models#fetching-data

Другие советы

ты пробовал:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top