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

#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'} в аннотацию ManyToOne

2. Привет, спасибо за ответ, я не уверен, что понимаю, вы думаете, что измененное мое отношение к сущности может решить проблему? У меня не будет такой же проблемы с различными отношениями?

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 — нет?