Poznajemy relację One to Many w Symfony. Kontynuacja lekcji poprzednich. Do dzieła.

Tworzymy nowe entity komendą:

symfony console make:entity

Tworzymy:

  • Nazwa – Comment
  • Nazwa pola – content
  • Typ pola – string
  • Długość – 500
  • Nullable – nie

Teraz modyfikujemy istniejące entity MircoPost. Komenda jak wyżej, następnie:

  • Nazwa – MicroPost
  • Nazwa pola – comments
  • Typ – OneToMany
  • Klasa – Comment
  • Field name – post
  • Nullable – no
  • Orphan removal – yes

Potem wykonujemy komendy:

symfony console make:migration;
symfony console doctrine:migrations:migrate

Powinniśmy dostać nową tabelę, która wygląda tak:

# 	Nazwa 	 Typ 	             Collation 	     Attributes 	Null 	Default 	Comments 	Extra 	
1 	id       Podstawowy int(11) 			                    Nie 	Brak 		            AUTO_INCREMENT 	
2 	post_id  Indeks int(11) 			                        Nie 	Brak 			
3 	content  varchar(500) 	    utf8mb4_unicode_ci 		        Nie 	Brak 				

Ok, teraz w MicroPostController tworzymy testową metodę, która utworzy komendę, która utworzy testowy komentarz:

#[Route('/micro_post_test_route', name: 'app_micro_post_test_route')]
    public function testRoute(EntityManagerInterface $entityManager): Response
    {
        $post = $entityManager->getRepository(MicroPost::class)->find(1);

        $comment = new Comment();
        $comment->setContent("Some comment");
        $comment->setPost($post);

        $entityManager->persist($comment);
        $entityManager->flush();

        return $this->redirectToRoute('app_micro_post');
    }

Powinniśmy już rozumieć, co się tu dzieje, wyjaśnię:

  • Skoro będziemy zapisywać (comment), to potrzebny entity manager
  • Skoro będziemy wyszukiwać (post) to potrzebne repozytorium
  • Entity Manager może wyciągnąć repozytorium danego entity po nazwie klasy (dzięki temu mniej parametrów w nawiasach)
  • Wyciągamy repozytorium i wyszukujemy post o id 1
  • Zakładam, że zaimportowaliśmy App\Entity\Comment
  • Tworzymy nowy Comment
  • Przypisujemy treść
  • Przypisujemy relację do posta (w Laravelu mówilibyśmy, że Comment jest w relacji belongsTo do Post)
  • Entity manager robi persist
  • Entity manager robi flush
  • Redirecty też już robić umiemy

Teraz jak wejdziemy do bazy danych to zobaczymy w comments poprawnie utworzony rekord.