Index de l'article

Relations entre entités

Dans notre cas nous avons déjà l'entité Customer. Nous allons ajouter une relation de type 1 à plusieurs vers des adresses (dans Customer, une relation OneToMany).

Créez une 2nd entité Address.

Revenez dans votre entité Customer (php bin/console make:entity puis Customer), puis créez un champ address de type relation.

Nommez customer_id le champ de stockage des customers dans la table address.

Ensuite, dans votre contrôleur CustomerAdmin, où vous appelez des champs dans le formulaire via la fonction configureFormFields, ajoutez dans la fonction ce code pour appeler la relation :

$addressFieldOptions = [
// see available options
'multiple' => true,
'label' => 'Address',
'class' => 'App\Entity\Address',
'required' => true,
'property' => 'getAdd1',
'by_reference' => true,
'translation_domain' => 'SonataUserBundle'
];
$formMapper->add('address', ModelType::class, $addressFieldOptions) ;

Afin de gérer le lien avec les id des customers au moment de l'enregistrement (dans customer_id), ajoutez cette nouvelle fonction après configureFormFields.

public function preUpdate($object)
{
foreach ($object->getAddress() as $address) {
$address->setCustomer($object);
}
}

Enfin, afin de gérer la suppression, retournez dans l'entité Customer, au niveau de la relation OneToMany, pour ajouter un cascade et un orphanRemoval.

/**
* @ORM\OneToMany(targetEntity="App\Entity\Address", mappedBy="customer", cascade={"all"}, orphanRemoval=true)
*/
private $address;