Сохранение выбранных объектов в отображенных отношениях в Doctrine 2 - PullRequest
1 голос
/ 13 июня 2011

Я пытаюсь сопоставить отношения между двумя таблицами MySQL в Doctrine 2. Моим владельцем объекта является «Кампания», он присоединяется к «Каналу».

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

table relationship

Я определил отображение с использованием Doctrine 2 XML следующим образом:

    <one-to-one field="channelId" target-entity="Channel" fetch="EAGER">
        <join-column name="channel_id" referenced-column-name="id" />
    </one-to-one>

При заполнении сущности кампании и попытке ее сохранения я получаю следующую ошибку:

Новый объект был найден в связи, которая не была настроенадля каскадного сохранения операций: Mvc \ Entity \ Channel @ 0000000034b3dcd500000000cc77faae.Явно сохраняйте новый объект или настраивайте каскадные операции сохранения для отношения.

Как должно быть указано это сохранение, я не хочу изменять или сохранять объект канала.Я изучил документацию Doctrine 2 о «сопоставлении ассоциаций», но не могу понять, как это возможно.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Когда вы сохраняете объект, вам необходимо убедиться, что все связанные объекты также сохранены. В этом случае вы создаете кампанию и связываете ее с каналом. Если объект Channel еще не сохранен, это необходимо сделать перед вызовом flush или установить постоянный каскад отношений. Вот ваши два варианта:

1) В вашем коде при сохранении Campaign также явно сохраняется Канал.

$em->perist($campaign);
$em->persist($campaign->getChannel());

2) Установите постоянный каскад на Campaign :: channel. Это автоматически сохранит объект Channel, когда он будет связан с Campaign. Я не знаю точный синтаксис в XML, но попробуйте

<one-to-one field="channelId" target-entity="Channel" fetch="EAGER">
    <join-column name="channel_id" referenced-column-name="id" />
    <cascade><cascade-persist /></cascade>
</one-to-one>
1 голос
/ 14 июня 2011

Нашел кого-то с похожей проблемой здесь . Проблема заключалась в том, что в XML-коде Campaign было 2 ссылки на таблицу Channels (channel_id и channel_name). Требуется только идентификатор канала, и объект канала должен быть создан и назначен объекту кампании, прежде чем объект кампании будет сохранен.

Странно, мне не нужно было явно сохранять сущность Channel отдельно. XML-карта моей кампании выглядит следующим образом:

<one-to-one field="channelId" target-entity="ToastChannels" fetch="EAGER">
 <join-column name="channel_id" referenced-column-name="id" />
</one-to-one>

Задание выглядит так:

    $channelEntity = $this->_channelsDao->disableCache()->findObject($channelId]);
    $campaignEntity->setChannel($channelEntity);
    return $this->_campaignDao->save($campaignEntity);

На уровне БД в таблице Campaign сохраняется только идентификатор канала, как и ожидалось. Я до сих пор не уверен в том, как это возможно, поскольку не было задано правило персистентности.

...