Relations Many-To-Many avec Symfony & Doctrine

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…

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *