#php #symfony #doctrine-orm
#php #symfony #doctrine-orm
Вопрос:
В моем проекте у меня есть 2 таблицы Devis и DetailsDevis, обе они связаны с устройством отображения ManyToOne :
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="boolean")
*/
private $devis_admin;
/**
* @ORMOneToOne(targetEntity="AppEntityDetailsDevis", mappedBy="devis_id", cascade={"persist"})
*/
private $devis_id;
/**
* @ORMManyToOne(targetEntity="AppEntityUser", inversedBy="utilisateur_id")
* @ORMJoinColumn(nullable=false)
*/
private $utilisateur_id;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $intitule_devis;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $periodicite;
/**
* @ORMColumn(type="blob", nullable=true)
*/
private $rappel_du_besoin;
И моя DetailsDevis entity :
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="integer")
*/
private $quantite;
/**
* @ORMColumn(type="decimal", precision=9, scale=2)
*/
private $prix_vente;
/**
* @ORMColumn(type="decimal", precision=5, scale=2)
*/
private $taxe_vente;
/**
* @ORMManyToOne(targetEntity="AppEntityDevis", inversedBy="devis_id", cascade={"persist"})
* @ORMJoinColumn(nullable=false)
*/
private $devis_id;
/**
* @ORMManyToMany(targetEntity="AppEntityProduit", mappedBy="detailsDevis")
*/
private $produits;
В одном из моих контроллеров я хочу создать экземпляр нового объекта devis, я сделал это :
$devis = (new Devis())
->setDevisAdmin(0)
->setUtilisateurId($this->getUser());
$this->entityManagerInterface->persist($devis);
$this->entityManagerInterface->flush();
Но когда я пытаюсь запустить код, появляется следующая ошибка :
Новый объект был найден через отношение ‘App Entity Produit#detailsDevis’, которое не было настроено на каскадные операции сохранения для объекта: App Entity DetailsDevis@000000006abb04ea000000001f58b5a5. Чтобы решить эту проблему: либо явно вызовите EntityManager#persist() для этого неизвестного объекта, либо настройте каскадное сохранение этой ассоциации в сопоставлении, например @ManyToOne(..,cascade={«persist»}). Если вы не можете выяснить, какая сущность вызывает проблему, реализуйте ‘App Entity DetailsDevis#__toString()’, чтобы получить подсказку.
Факт в том, что у DetailsDevis
уже есть cascade={"persist"}
сопоставление ассоциаций.
В сообщении также говорилось, что create __toString()
, может помочь мне найти подсказку. Но я не знаю, что мне нужно вернуть, чтобы создать this toString большая часть моей информации в таблице является десятичной или relation… У кого-нибудь есть идея о том, что делать? Спасибо.
Комментарии:
1. Используйте
@ManyToOne
и@OneToMany
для связи Devis / DetailsDevis, смотрите документ и добавьтеcascade={'persist'}
в аннотацию ManyToOne2. Привет, спасибо за ответ, я не уверен, что понимаю, вы думаете, что измененное мое отношение к сущности может решить проблему? У меня не будет такой же проблемы с различными отношениями?
3. Ваше отношение ManyToOne определено не так, как должно быть. (Смотрите ссылку в моем 1-м комментарии). У вас должно быть
@ManyToOne
в классе Devis и@OneToMany
в классе DetailsDevis, а не@ManyToOne
в обоих.4. Спасибо, я попытался переназначить, как вы сказали, но у меня все еще есть то же сообщение об ошибке.
Ответ №1:
Измените persist
на merge
. сработало для меня
`$devis = (new Devis())
->setDevisAdmin(0)
->setUtilisateurId($this->getUser());
$this->entityManagerInterface->merge($devis);
$this->entityManagerInterface->flush();`
Комментарии:
1. не могли бы вы объяснить, почему merge работает, а persist — нет?