Relations Many-To-Many avec Symfony & Doctrine
Le but est de gérer les relations M:M dans vos projets, en proposant dans votre backend une sfWidgetFormSelectDoubleList afin de faire facilement les associations.
L’exemple sera le suivant : on veut gérer des livres écrits par des auteurs. Un auteur peut écrire plusieurs livres, et un livre peut être écrit par plusieurs auteurs. Nous sommes donc typiquement dans le cas des relations M:M (ou n:n).
Notre fichier schema.yml est le suivant :
Book: columns: id: { type: integer(4), primary: true, autoincrement: true } title: { type: string(100), notnull: true } content: { type: clob, notnull: true } relations: Authors: class: Author refClass: AuthorBook local: book_id foreign: author_id Author: columns: id: { type: integer(4), primary: true, autoincrement: true } title: { type: string(100), notnull: true } relations: Books: class: Book refClass: AuthorBook local: author_id foreign: book_id AuthorBook: columns: author_id: { type: integer(4), primary: true } book_id: { type: integer(4), primary: true }
Il faut bien entendu utiliser une table annexe (AuthorBook) qui gérera les ralations M:M.
Prenons le temps de peupler notre base de données, en renseignant le fichier data/fixtures/fixtures.yml .
Installation du plugin sfFormExtraPlugin :
symfony plugin:install sfFormExtraPlugin symfony plugin:publish-assets
On crée dans notre backend un module pour gérer les livres :
symfony doctrine:generate-admin backend Book --module=livre
Il suffit ensuite de modifier lib/form/doctrine/BookForm.class.php en :
class BookForm extends BaseBookForm { public function configure() { $this->widgetSchema['authors_list']->setOption('renderer_class', 'sfWidgetFormSelectDoubleList'); } }
Et c’est tout : vous pourrez associer directement vos livres et vos auteurs dans votre backend…