Eloquent, belongsToMany

Voir la vidéo
Description Sommaire

Dans le chapitre nous avons vu l'utilisation du belongsTo / hasMany dans le cadre d'une relation de type 1..n. Mais que se passe-t-il si on souhaite mettre en place une liaison n..n ?

belongsToMany

Pour faire fonctionner une telle liaison il va falloir commencer par préparer notre base de donner et créer la table pivot.

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTagsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });

        Schema::create('post_tag', function(Blueprint $table){
            $table->increments('id');
            $table->integer('post_id')->unsigned()->index();
            $table->integer('tag_id')->unsigned()->index();
            $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tags');
    }

}

On remarquera ici l'utilisation de clef étrangère pour établir une suppression en cascade de nos enregistrement à la suppression d'un autre contenu. Ceci afin d'éviter de se retrouver avec une base de données avec des enregistrements fantômes. Le nom de la table pivot est aussi important, c'est le nom des tables à lier au singulier, organiser par ordre alphabétique et séparé par des _.

Ensuite pour établir la relation, le fonctionnement est le même que pour un hasMany().

class Post extends Model {

    public function tags(){
        return $this->belongsToMany('App\Tag');
    }

}
Publié
Technologies utilisées
Auteur :
Grafikart
Partager