Background to tak jakby produkt, backgroundOrder to zamówienie produktu (tła). Każde zamówienie posiada jedno tło. BackgroundOrder ma także referencje do innych encji (rozmiary, kupujący itd) ale to w tym przypadku nie istotne.
Mam formularz, który służy do zamówienia tego tła. Tło (background) jest wybierane z lisy "select". W formularzu wygląda to tak :
'class' => MojBundle:Background', 'property' => 'name', ))
W kontrolerze mam taki kod.
$em = $this->getDoctrine()->getManager(); $em->persist($backgroundOrder); $em->flush();
Ten kod działa ( mam ustawione cascade persist ) jednak tworzy mi nowy rekord w tabeli backgrounds co niezbyt mi odpowiada. Chcę, aby do zamówienia zostało dołączone istniejące już w bazie tło, a nie jego kopia.
Inaczej mówiąc, mam w tabeli backgrounds dwa rekordy:
id | name
-------------------
1 | background 1
2 | background 2
-------------------
Tworzę zamówienie wybierając tło pierwsze (background 1), to chcę, żeby w tabeli backgroundOrder w polu background był id = 1. Ten kod natomiast tworzy kopię tego tła i do mojego zamówienia jest linkowane nowe tło ( w tym przypadku o id 3).
Jeśli mój kod zmodyfikuję w ten sposób:
$em = $this->getDoctrine()->getManager(); $background = $em->getRepository('mojBundle:Background')->find($backgroundOrder->getBackground()->getId()); $backgroundOrder->setBackground($background); $em->persist($backgroundOrder); $em->flush();
To wtedy działa jak należy.
Tutaj fragment mojej entity:
class BackgroundOrder { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\ManyToOne(targetEntity="Background", inversedBy="backgroundOrders",cascade={"persist"}) * @ORM\JoinColumn(name="background", referencedColumnName="id", nullable=false) */ private $background;
W czym mam błąd i co powinienem zrobić, aby to naprawić ?
Jeśli podałem zbyt niewiele informacji, proszę napisać, co jeszcze mam wkleić.
edit://
Czemu jak dałem tylko tag [Symfony2] to nie mogę wysłać wiadomości ? (że niby tagów za mało)