Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF][SF2][Symfony2] Doctrine2 - dublowanie rekordu
peter13135
post 28.06.2013, 22:08:25
Post #1





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


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)

Ten post edytował peter13135 28.06.2013, 22:10:02


--------------------
:)
Go to the top of the page
+Quote Post
kallosz
post 29.06.2013, 08:08:15
Post #2





Grupa: Zarejestrowani
Postów: 272
Pomógł: 19
Dołączył: 29.07.2006

Ostrzeżenie: (10%)
X----


jesli robisz Persist dla backgroundorder to tworzy nowy rekord - czyli prawidłowo. Pokaż całość akcji z kontrolera.


--------------------
Pomogłem ?? Kliknij pomógł :) || kallosz.pl
-----------------------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.07.2025 - 19:44