Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF2][Symfony2][doctrine] po probie zapisania nowego obiektu nie widzi zmiany
robert0770
post 15.12.2017, 12:57:41
Post #1





Grupa: Zarejestrowani
Postów: 42
Pomógł: 1
Dołączył: 18.02.2015

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


cześć,

mam następujący problem

moja encja wygląda mniej więcej tak:
(oczywiście są tam komentarze przy mapowaniu oraz setery i getery)
  1. @ORM\Column(name="post_id", type="integer", nullable=false)
  2. protected $postId
  3. @ORM\ManyToOne(targetEntity="Abc\Efg\Entity\Post", fetch="LAZY")
  4. @ORM\JoinColumn(name="post_id", referencedColumnName="id")
  5. protected $post


i musi tak być bo oba pola są przydatne

przy próbie za setowania czego kol wiek do

  1. $Coś->setPostId(999)


wywala mi
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'post_id' cannot be null

to musi być tak zrobione, nie ma możliwości (ze względów wydajnościowych) na wyszukanie obiektu i zrobienie
  1. $Cos->setPost($Post)


Ten post edytował robert0770 15.12.2017, 13:05:51
Go to the top of the page
+Quote Post
Pilsener
post 15.12.2017, 17:43:22
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Nie wiem o co chodzi, ale na pierwszy rzut oka to masz zduplikowaną nazwę kolumny i nie powinno w ogóle utworzyć bazy:
  1. @ORM\Column(name="post_id", type="integer", nullable=false)
  2. @ORM\JoinColumn(name="post_id", referencedColumnName="id")
Go to the top of the page
+Quote Post
ohm
post 15.12.2017, 22:06:32
Post #3





Grupa: Zarejestrowani
Postów: 618
Pomógł: 143
Dołączył: 22.12.2010

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


+ jeszcze, albo wiążesz przez setPost($obiekt), albo przez $repository->getReference('Entity', $id) albo zostawiasz samo post_id bez żadnego mapowania jako zwykłą kolumnę integer.
Go to the top of the page
+Quote Post
robert0770
post 18.12.2017, 08:25:08
Post #4





Grupa: Zarejestrowani
Postów: 42
Pomógł: 1
Dołączył: 18.02.2015

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


to normalka, cały projekt który przejąłem po sporej grupie programistów gdzie jest z 40 encji, ma tak zdefiniowane pola dla ułatwienia, wyciąganie danych działa jak najbardziej
Go to the top of the page
+Quote Post
Puszy
post 18.12.2017, 14:25:35
Post #5





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Pokaż ciało setPost(); bo obstawiam że to nie jest zwykły setter i finalnie próbujesz ustawić post o id 999 który nie istnieje w bazie.

Ten post edytował Puszy 18.12.2017, 14:25:49
Go to the top of the page
+Quote Post
robert0770
post 21.12.2017, 10:45:37
Post #6





Grupa: Zarejestrowani
Postów: 42
Pomógł: 1
Dołączył: 18.02.2015

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


setPost to zwykły setter ustawiający obiekt

  1. /**
  2.   * setPost
  3.   *
  4.   * @param Post $post
  5.   *
  6.   * @return $this
  7.   */
  8. public setPost($post){
  9. $this->post = $post;
  10. return $this;
  11. }


setPostId to zwykły setter ustawiający inta

  1. /**
  2.   * setPostId
  3.   *
  4.   * @param int $postId
  5.   *
  6.   * @return $this
  7.   */
  8. public setPostId($postId){
  9. $this->postId = $postId;
  10. return $this;
  11. }


finalnie chcialem ustawić setPostId(0),
ale zarówno z 0 jak i z np id który jest w bazie czyli np 69 też to samo wywala
Go to the top of the page
+Quote Post
Puszy
post 21.12.2017, 12:09:43
Post #7





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nic tu nie pasuje:

1. W jednej encji masz pole $postId które w bazie nazywa się post_id oraz pole $post które w bazie też nazywa się post_id, validate-schema powinno Ci sypnąć chyba jakimś błędem.
2. Nie rozumiem po co trzymać relację do encji Abc\Efg\Entity\Post i jednocześnie pole integer z id postu. Właśnie dla uniknięcia takich sytuacji korzysta się z ORM.
3. Jeżeli ustawisz tylko $postId poprzez setPostId() to nie będziesz miał relacji między tabelami.
4. W $postId możesz wrzucić dowolną wartość, zarówno istniejących jak i nieistniejących postów, pomijam fakt dubli.

Wniosek: wywal pole $postId, i korzystaj z referencji tak jak Ci pisał ohm

  1. $entitymanager->getReference(Foo::class, 999);
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: 23.04.2024 - 11:22