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…