Как я могу разрешить повторяющиеся записи в коллекции Doctrine?
Вопрос
Я надеюсь, что здесь найдутся другие пользователи доктрины.
Вот упрощенный 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
, но на самом деле при сохранении коллекции в базе данных будет создана еще одна строка.