Подтвердить что ты не робот

Доктрина - новая сущность была найдена через отношения

с 2 недель, у нас возникает эта проблема, пытаясь смыть новые элементы:

CRITICAL: Doctrine\ORM\ORMInvalidArgumentException:

Новый объект был найден через связь "Комментарий # захвата", которая не была настроена на каскадное сохранение операций для объекта

Но capture уже находится в базе данных, и мы получаем его с помощью findOneBy, поэтому, если мы каскадом сохраняем его или сохраняем, мы получаем

Нарушение ограничения таблицы: дубликат записи.

Комментарии создаются в цикле с различными захватами, с новым и всем необходимым полем.

Когда все объекты сохраняются и/или получаются с помощью findOne (и все они действительны), флеш все еще не работает.

Я занимаюсь этим вопросом некоторое время, поэтому, пожалуйста, помогите мне

4b9b3361

Ответ 1

У меня была та же проблема, и она была такой же EntityManager. Я хотел вставить объект, связанный с ManyToOne. И я не хочу cascade persist.

Пример:

$category = $em->find("Category", 10);

$product = new Product();
$product->setCategory($category)

$em->persist($product);
$em->flush();

Это вызывает для меня одно и то же исключение.

Итак, решение:

$category = $em->find("Category", 10);

$product = new Product();
$product->setCategory($category)

$em->merge($product);
$em->flush();

Ответ 2

В моем случае слишком ранний вызов

$this->entityManager->clear();

вызвало эту проблему. Он также исчез только после того, как прояснил последний объект, например

$this->entityManager->clear($capture);

Ответ 3

Мой ответ относится к теме, но не очень уместен для вашего конкретного случая, поэтому для тех googling я публикую это, так как ответы выше не помогли мне.

В моем случае у меня была такая же ошибка с объектами пакетной обработки, у которых было отношение, и это отношение было установлено на ту же самую сущность.

ЧТО Я НЕИСПРАВНОСТЬ:

Когда я выполнял $this->entityManager->clear(); при обработке партии объектов, я получал бы эту ошибку, потому что следующая партия объектов указывала бы на отдельный связанный объект.

ЧТО НЕ ПОСЫЛО:

  • Я не знал, что $this->entityManager->clear(); работает так же, как $this->entityManager->detach($entity); только отделяет ВСЕ объекты репозитория.

  • Я думал, что $this->entityManager->clear(); также отделяет связанные объекты.

ЧТО Я ДОЛЖЕН СДЕЛАТЬ:

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

Я надеюсь, что это поможет кому-то.

Ответ 4

Прежде всего, вам следует лучше позаботиться о своем коде, я вижу, как 3 разных отступов в вашей сущности и контроллере - это трудно прочитать и не подходит для Symfony2 стандартов кодирования.

Код который вы показываете для своего контроллера, не является полным, мы понятия не имеем, откуда $this->activeCapture. Внутри есть $people['capture'], который содержит объект Capture, который я предполагаю. Это очень важно.

Если Capture in $people['capture'] сохраняется/извлекается из другого EntityManager, чем $this->entityManager (что, опять же, мы не знаем, откуда оно), Doctrine2 не знает, что объект уже сохраняется.

Вы должны использовать один и тот же экземпляр Doctrine Entity Manager для всех этих операций (используйте spl_object_hash для объекта EM, чтобы убедиться, что они являются одним и тем же экземпляром).

Вы также можете сообщить EntityManager, что делать с объектом Capture.

// Refreshes the persistent state of an entity from the database
$this->entityManager->refresh($captureEntity);

// Or
// Merges the state of a detached entity into the 
// persistence context of this EntityManager and returns the managed copy of the entity.
$captureEntity = $this->entityManager->merge($captureEntity);

Если это не помогает, вы должны предоставить больше кода.

Ответ 5

Ошибка:    "Комментарий # захвата", который не был сконфигурирован для каскадной операции persist для объекта

Проблема:

/**
 * @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments")
 * @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true)
 */
 protected $capture;

Не настроен каскадный упор

попробуйте следующее:

/**
 * @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments", cascade={"persist", "remove" })
 * @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true)
 */
 protected $capture;

Ответ 6

Я тоже получил эту ошибку при попытке добавить новый объект.

A new entity was found through the relationship 'Application\Entity\User#chats' 
that was not configured to cascade persist operations for entity: ###. 
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or
configure cascade persist  this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

В моем случае я пытался сохранить объект, который не должен быть сохранен. Соотношения сущностей были заполнены и пытались сохранить (User имеет Chat в Many2Many, но Чат был временной сущностью), но были некоторые столкновения.

Итак, если я использую cascade={"persist"}, я получаю нежелательное поведение - объект мусора сохраняется. Мое решение состояло в том, чтобы удалить не сохраняющий объект из любых сохраняющих объектов:

// User entity code
public function removeFromChats(Chat $c = null){
    if ($c and $this->chats->contains($c)) {
        $this->chats->removeElement($c);
    }
}

Сохранение кода

/* some code witch $chat entity */
$chat->addUser($user);

// saving
$user->removeFromChats($chat);
$this->getEntityManager()->persist($user);
$this->getEntityManager()->flush();