При сохранении данных отправки формы у меня возникают проблемы с сохранением нового экземпляра объекта, у которого есть ассоциация, допускающая значение NULL, с другой сущностью, и я пытаюсь установить для него значение NULL.После создания нового экземпляра сущности для формы, привязки представленного запроса к форме и сохранения и очистки экземпляра сущности, в зависимости от того, как я заполняю свойство для связанной сущности, я получаю либо
UnexpectedTypeException: ожидаемый аргумент типа " объект или массив »,« NULL »задано
(если установлено значение null) или InvalidArgumentException: через связь« AccessLog # документ »была обнаружена новая сущность, которая не была настроена для каскадирования операций сохранения для сущности
(если установлен новый пустой экземпляр связанной сущности, который я не хочу сохранять). Если я настроил сохранение каскада, он попытается создать запись в связанной таблице (что не разрешено моделью данных в базе данных), даже если нет данных для сохранения. Если настройка сохранения каскада является правильным решением, как мне предотвратить попытки создания новой записи? Как лучше всего с этим справиться?
Обратите внимание, что поведение одинаково независимо от того, настроена ли ассоциация как однонаправленная или двунаправленная.
Подробности:
У меня есть сущность с ассоциацией «многие к одному» с другой сущностью (сокращенно):
/** @Entity */
class AccessLog
{
/** @Id @Column(type="integer") */
private $access_log_id;
/** @Column(type="integer", nullable=true) */
private $document_id;
/**
* @ManyToOne(targetEntity="Document", inversedBy="access_logs", cascade={"persist"})
* @JoinColumn(name="document_id", referencedColumnName="document_id")
*/
private $document;
// plus other fields
// plus getters and setters for all of the above...
}
Связанная сущность не представляет ничего особенного:
/** @Entity */
class Document
{
/** @Id @Column(type="integer") */
private $document_id;
/** @Column(length=255) */
private $name;
/** @OneToMany(targetEntity="AccessLog", mappedBy="document") */
private $access_logs;
// plus other fields
// plus getters and setters for all of the above...
}
У меня есть форма Symfony для ввода данных для новых Записи AccessLog:
class AccessLogFormType extends AbstractType
{
public function getName()
{
return 'access_log_form';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'AccessLog');
}
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('access_log_id', 'hidden');
$builder->add('document_id', 'hidden', array(
'required' => false
));
$builder->add('document', new DocumentType(), array(
'label' => 'Document',
'required' => false
));
//...
}
}
Со следующим определением поддерживающего типа:
class DocumentType extends AbstractType
{
public function getName()
{
return 'document';
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'Document');
}
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('name', 'text', array(
'required' => false
));
}
}
Мой контроллер включает следующее:
public function save_access_log_action()
{
$request = $this->get('request');
$em = $this->get('doctrine.orm')->getEntityManager();
$access_log = null;
if ($request->getMethod() === 'POST') {
$data = $request->request->get('access_log_form');
if (is_numeric($data['access_log_id'])) {
$access_log = $em->find('AccessLog', $data['access_log_id']);
} else {
$access_log = new AccessLog();
}
if (is_numeric($data['document_id'])) {
$document = $em->find('Document', $data['document_id']);
$access_log->set_document($document);
} else {
// Not calling set_document() since there shouldn't be a
// related Document entity.
}
$form = $this->get('form.factory')
->createBuilder(new AccessLogFormType(), $access_log)
->getForm();
$form->bindRequest($request);
if ($form->isValid()) {
$em->persist($access_log);
$em->flush();
}
} else {
// ... (handle get request)
}
return $this->render('access_log_form.tpl', array(
'form' => $form->createView()
));
}
Приведенный выше код отлично работает при обновлении существующей записи журнала доступа или создании новой, а документ выбран в форме , но не, если не выбран ни один документ.
Если модель данных не может быть изменена, как мне сохранить новую сущность AccessLog без сохранения новой сущности Document?