Nous allons ici développer l’ensemble des manipulations pour construire une interface many to many via Sonata.
Nous prendrons comme exemple une gestion de zones avec une liaison par départements. Chaque zones est donc constitué d’un liaison multiple avec la table département.
Sous MysqlWorkbench, cela donne ceci :
Pour générer les entity, nous utilisons la commande suivante :
php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

Ensuite, nous créons les setter et getter dans nos entity via la commande :
php bin/console make:entity --regenerate App

Il ne nous reste plus qu’a générer notre CRUD sonata sans oublier de vider le cache.
php bin/console make:sonata:admin App/Entity/ZxZone
php bin/console cache:clear

Notre interface sera créé et le service aussi. Il nous faudra tout de même faire quelques manipulations.
1 – Supprimer l’ID de notre formulaire de création d’enregistrement et ajouter notre champs département
//ajouter le use suivant
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
//supprimez l'id, et ajouter la liaison département
protected function configureFormFields(FormMapper $formMapper): void
{
$formMapper
//->add('id')
->add('label')
->add('code')
->add('departement', EntityType::class, [
'class' => 'App\Entity\Departement',
'choice_label' => 'label',
'label' => 'Départements',
'required' => false,
'by_reference' => false,
'multiple' => true,
'expanded' => false,
]);
}
Dans la définition de département nous demandons explicitement d’afficher le champs label dans notre liste, via le paramètre « choice_label ».
Cela nous permet d’afficher un label plus sympa que juste l’id. Mais pour cela, il faut ajouter les méthodes suivantes dans l’entity departement.
//Permet d'afficher un nom plus sympa dans les messages du CRUD
public function __toString(): ?string
{
return $this->id." : ".$this->nomClairRiche;
}
//Permet d'afficher un label dans notre liste de configuration
public function getLabel(): ?string
{
return $this->id." : ".$this->nomClairRiche;
}
