Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2] Doctrine2 - dublowanie rekordu
Forum PHP.pl > Forum > PHP > Frameworki
peter13135
Mam dwie klasy Entity: Background oraz BackgroundOrder.
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 :

  1. ->add('background', 'entity', array(
  2. 'class' => MojBundle:Background',
  3. 'property' => 'name',
  4. ))


W kontrolerze mam taki kod.
  1. $em = $this->getDoctrine()->getManager();
  2. $em->persist($backgroundOrder);
  3. $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:

  1. $em = $this->getDoctrine()->getManager();
  2. $background = $em->getRepository('mojBundle:Background')->find($backgroundOrder->getBackground()->getId());
  3. $backgroundOrder->setBackground($background);
  4. $em->persist($backgroundOrder);
  5. $em->flush();

To wtedy działa jak należy.

Tutaj fragment mojej entity:
  1. class BackgroundOrder {
  2.  
  3. /**
  4.   * @var integer
  5.   *
  6.   * @ORM\Column(name="id", type="integer")
  7.   * @ORM\Id
  8.   * @ORM\GeneratedValue(strategy="AUTO")
  9.   */
  10. private $id;
  11.  
  12. /**
  13.   * @ORM\ManyToOne(targetEntity="Background", inversedBy="backgroundOrders",cascade={"persist"})
  14.   * @ORM\JoinColumn(name="background", referencedColumnName="id", nullable=false)
  15.   */
  16. 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)
kallosz
jesli robisz Persist dla backgroundorder to tworzy nowy rekord - czyli prawidłowo. Pokaż całość akcji z kontrolera.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.