с 2 недель, у нас возникает эта проблема, пытаясь смыть новые элементы:
CRITICAL: Doctrine\ORM\ORMInvalidArgumentException:
Новый объект был найден через связь "Комментарий # захвата", которая не была настроена на каскадное сохранение операций для объекта
Но capture
уже находится в базе данных, и мы получаем его с помощью findOneBy
, поэтому, если мы каскадом сохраняем его или сохраняем, мы получаем
Нарушение ограничения таблицы: дубликат записи.
Комментарии создаются в цикле с различными захватами, с новым и всем необходимым полем.
Когда все объекты сохраняются и/или получаются с помощью findOne
(и все они действительны), флеш все еще не работает.
Я занимаюсь этим вопросом некоторое время, поэтому, пожалуйста, помогите мне
У меня была та же проблема, и она была такой же 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();
В моем случае слишком ранний вызов
$this->entityManager->clear();
вызвало эту проблему. Он также исчез только после того, как прояснил последний объект, например
$this->entityManager->clear($capture);
clear()
вызвал такое поведение?
Мой ответ относится к теме, но не очень уместен для вашего конкретного случая, поэтому для тех googling я публикую это, так как ответы выше не помогли мне.
В моем случае у меня была такая же ошибка с объектами пакетной обработки, у которых было отношение, и это отношение было установлено на ту же самую сущность.
ЧТО Я НЕИСПРАВНОСТЬ:
Когда я выполнял $this->entityManager->clear();
при обработке партии объектов, я получал бы эту ошибку, потому что следующая партия объектов указывала бы на отдельный связанный объект.
ЧТО НЕ ПОСЫЛО:
Я не знал, что $this->entityManager->clear();
работает так же, как $this->entityManager->detach($entity);
только отделяет ВСЕ объекты репозитория.
Я думал, что $this->entityManager->clear();
также отделяет связанные объекты.
ЧТО Я ДОЛЖЕН СДЕЛАТЬ:
Я должен был повторить действия над сущностями и отделить их один за другим - это не приведет к отсоединению связанного объекта, на который указывают будущие сущности.
Я надеюсь, что это поможет кому-то.
$this->entityManager->clear('EntityName');
отделить только один вид сущностей. Может помочь, если отсоединяемые все одинакового типа и больше не нужны в EM
Прежде всего, вам следует лучше позаботиться о своем коде, я вижу, как 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);
Если это не помогает, вы должны предоставить больше кода.
Ошибка: "Комментарий # захвата", который не был сконфигурирован для каскадной операции 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;
Я тоже получил эту ошибку при попытке добавить новый объект.
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();