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)
Gutscheine (Voucher)
Speichern des Formulars:
Rückgabewert des Formulars (Objekt, Auszug)
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
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;
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;
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();
}
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)
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
Kommentar