Formulieren met een relatie (Entity-relation)

Formulieren met een relatie

Soms wil je iets toevoegen of aanpassen waarbij er sprake is van een relatie. In dit voorbeeld hebben we twee relaties. Book waarin boeken zitten en een boek heeft een Author die het boek geschreven heeft. Voor de simpelheid van dit voorbeeld is het een ManyToOne relatie waarbij een auteur meerdere boeken kan schrijven en een boek altijd maar een auteur heeft.
Het standaard formulier ziet er dan zo uit:

//De volgende regels staan in de use-space
use App\Entity\Author; //Connectie naar de Author entity
use App\Entity\Book; //Connectie naar de Book entity
use Symfony\Bridge\Doctrine\Form\Type\EntityType; //De EntityType

//In de BookType class
public function buildForm(FormBuilderInterface $builder, array $options): void
{
    $builder
        ->add('name')
        ->add('description')
        ->add('author', EntityType::class, [
            'class' => Author::class,
            'choice_label' => 'id',
        ])
    ;
}
Het standaard aangemaakte formulier voor het toevoegen van een boek
Er komt nu een select-menu in het formulier die de keuze geeft van alle rijen uit de Author entity (of author tabel in de database). Maar standaard zie je niet de naam maar de id van het veld. Dit willen we niet. De entity heeft een attribuut name wat de naam van de auteur weergeeft.
Dit voorbeeld heeft ook nog geen labels en geen submit knop. Deze gaan we allemaal toevoegen:
//De volgende regels staan in de use-space
use App\Entity\Author; //Connectie naar de Author entity
use App\Entity\Book; //Connectie naar de Book entity
use Symfony\Bridge\Doctrine\Form\Type\EntityType; //De EntityType
use Symfony\Bridge\Doctrine\Form\Type\SubmitTyoe; //De SubmitType voor de button

//In de BookType class
public function buildForm(FormBuilderInterface $builder, array $options): void
{
    $builder
        ->add('name', null, ['label' => 'Naam van het boek'])
        ->add('description', null, ['label' => 'Samenvatting van het boek']))
        ->add('author', EntityType::class, [
            'class' => Author::class,
            'choice_label' => 'name',
            'label' => 'Wie is de auteur?'
        ])
        ->add('submit', SubmitType::class, ['label' => 'Voeg dit boek toe']))
    ;
}
Een voorbeeld van een mooi formulier met de relatie