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.