Ankündigung

Einklappen
Keine Ankündigung bisher.

Symfony Doctrine OneToMany / ManyToOne

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Symfony Doctrine OneToMany / ManyToOne

    Hallo,

    ich habe ein Problem mit der oben genannten Beziehung in Doctrine. Und zwar speichere ich über ein Formular Bestellungen, bei denen optional ein Gutscheincode angegeben werden kann. Wird der Gutscheincode gesetzt und der Code ist gültig, erhalte ich nach Absenden des Formulars ein Objekt der Bestellung (Order) mit der Relation zu einem Gutschein (Voucher). Sobald ich einfach nur die Bestellung speichern möchte, meint Doctrine, auch den Gutschein speichern zu müssen (als komplette neue Zeile) und nicht nur die ID als Relation in der Tabelle für die Bestellungen zu speichern. Was mache ich falsch? Wo ist mein Denkfehler?

    Ich habe folgende vereinfachte Entities:

    Bestellung (Order)

    PHP-Code:
    <?php

    namespace AppBundle\Entity;

    use 
    Doctrine\ORM\Mapping as ORM;

    /**
     * Order
     *
     * @ORM\Table(name="orders")
     * @ORM\Entity
     */
    class Order
    {
        
    /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        
    private $id;

        
    /**
         * @var type integer
         *
         * @ORM\ManyToOne(targetEntity="Voucher", inversedBy="orders")
         * @ORM\JoinColumn(name="voucher_id", referencedColumnName="id")
         */
        
    private $voucher;
    Gutscheine (Voucher)

    PHP-Code:
    <?php

    namespace AppBundle\Entity;

    use 
    Doctrine\ORM\Mapping as ORM;

    /**
     * Voucher
     *
     * @ORM\Table(name="vouchers")
     * @ORM\Entity
     */
    class Voucher
    {
        
    /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        
    private $id;

        
    /**
         * @var type string
         *
         * @ORM\Column(name="code", type="string", length=100, unique=true)
         */
        
    private $code;

        
    /**
         * @var type float
         *
         * @ORM\Column(name="price", type="decimal", precision=15, scale=2)
         */
        
    private $price;

        
    /**
         *
         * @var type integer
         *
         * @ORM\OneToMany(targetEntity="Order", mappedBy="voucher")
         */
        
    private $orders;
    Speichern des Formulars:

    PHP-Code:
    [...]

    $order = new Order();

    $form $this->createForm(new OrderType(),  $order);
    $form->handleRequest($request);

    if(
    $form->isValid()) {
            
    // Hier will Doctrine den Voucher nochmals in die Datenbank schreiben, obwohl dieser bereits existiert...
            
    $entityManager $this->getDoctrine()->getManager();
            
    $entityManager->persist($order);
            
    $entityManager->flush();

    Rückgabewert des Formulars (Objekt, Auszug)

    Code:
     object(AppBundle\Entity\Order)[524]   private 'id' => null   private 'voucher' =>      object(AppBundle\Entity\Voucher)[526]       private 'id' => int 1       private 'code' => string '123456' (length=6)       private 'price' => string '5.00' (length=4)
    Doctrine sollte doch eigentlich erkennen, dass der Voucher bereits eine ID besitzt und nicht erneut eingefügt werden muss, oder?
    Sieht jemand meinen Denkfehler? In der Tabelle "orders" soll lediglich das Feld "voucher_id" auf die ID des Vouchers gesetzt werden. Der Voucher soll nicht komplett neu gespeichert werden.

    Danke für die Hilfe

  • #2
    Das Problem wurde gelöst - es lag an unterschiedlichen EntityManagern. Doofer Fehler :/

    Kommentar

    Lädt...
    X