La relation "BelongsTo" dans Laravel
La relation "BelongsTo" dans Laravel est utilisée pour définir une relation où une table appartient à une autre table. Elle est souvent utilisée pour définir une relation "many-to-one" entre deux tables, où plusieurs enregistrements de la table enfant appartiennent à un seul enregistrement de la table parente. La clé étrangère est généralement stockée dans la table enfant, faisant référence à la clé primaire de la table parente.
Supposons que nous avons deux tables : articles et categories.
Chaque article appartient à une catégorie.
Migration pour la table articles :
// database/migrations/YYYY_MM_DD_create_articles_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id('idArticle'); // Nommer la clé primaire avec idTable
$table->string('title');
$table->text('content');
$table->unsignedBigInteger('category_id'); // Clé étrangère
$table->foreign('category_id')->references('idCategory')->on('categories');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('articles');
}
}
Migration pour la table categories :
// database/migrations/YYYY_MM_DD_create_categories_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id('idCategory'); // Nommer la clé primaire avec idTable
$table->string('name');
// Ajoutez d'autres colonnes au besoin
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('categories');
}
}
Modèle pour la table Article :
// app/Models/Article.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $table = 'articles';
protected $primaryKey = 'idArticle'; // Nommer la clé primaire avec idTable
protected $fillable = ['title', 'content', 'category_id'];
public function category()
{
return $this->belongsTo(Category::class, 'category_id', 'idCategory');
//$table->foreign('category_id')->references('idCategory')->on('categories');
}
}
Modèle pour la table Category :
// app/Models/Category.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';
protected $primaryKey = 'idCategory'; // Nommer la clé primaire avec idTable
protected $fillable = ['name'];
public function articles()
{
return $this->hasMany(Article::class, 'category_id', 'idArticle');
/*
class Article extends Model
...
$table->id('idArticle');
...
$table->unsignedBigInteger('category_id'); // Clé étrangère
$table->foreign('category_id')->references('idCategory')->on('categories');
*/
}
}
Exemple 2
une application de gestion de tâches où une tâche appartient à un utilisateur. Nous aurons donc deux tables : tasks et users.
Migration pour la table tasks :
// database/migrations/YYYY_MM_DD_create_tasks_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->id('idTask'); // Nommer la clé primaire avec idTable
$table->string('title');
$table->text('description');
$table->unsignedBigInteger('user_id'); // Clé étrangère
$table->foreign('user_id')->references('idUser')->on('users');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('tasks');
}
}
Migration pour la table users :
// database/migrations/YYYY_MM_DD_create_users_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id('idUser'); // Nommer la clé primaire avec idTable
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
Modèle pour la table Task :
// app/Models/Task.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
protected $table = 'tasks';
protected $primaryKey = 'idTask'; // Nommer la clé primaire avec idTable
protected $fillable = ['title', 'description', 'user_id'];
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'idUser');
}
}
Modèle pour la table User :
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users';
protected $primaryKey = 'idUser'; // Nommer la clé primaire avec idTable
protected $fillable = ['name', 'email', 'password'];
public function tasks()
{
return $this->hasMany(Task::class, 'user_id', 'idTask');
}
}
Dans cet exemple, une tâche (Task) appartient à un utilisateur (User). La clé étrangère user_id dans la table des tâches fait référence à la clé primaire idUser dans la table des utilisateurs. Les méthodes user() dans le modèle Task et tasks() dans le modèle User définissent la relation "BelongsTo" et "HasMany", respectivement. Vous pouvez ensuite accéder à l'utilisateur associé à une tâche ou aux tâches associées à un utilisateur de la même manière que dans l'exemple précédent.
un blog, où un commentaire appartient à un article. Les deux tables associées seront comments et articles.
Migration pour la table comments :
// database/migrations/YYYY_MM_DD_create_comments_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id('idComment'); // Nommer la clé primaire avec idTable
$table->text('content');
$table->unsignedBigInteger('article_id'); // Clé étrangère
$table->foreign('article_id')->references('idArticle')->on('articles');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('comments');
}
}
Migration pour la table articles :
// database/migrations/YYYY_MM_DD_create_articles_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id('idArticle'); // Nommer la clé primaire avec idTable
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('articles');
}
}
Modèle pour la table Comment :
// app/Models/Comment.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
protected $table = 'comments';
protected $primaryKey = 'idComment'; // Nommer la clé primaire avec idTable
protected $fillable = ['content', 'article_id'];
public function article()
{
return $this->belongsTo(Article::class, 'article_id', 'idArticle');
}
}
Modèle pour la table Article :
// app/Models/Article.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $table = 'articles';
protected $primaryKey = 'idArticle'; // Nommer la clé primaire avec idTable
protected $fillable = ['title', 'content'];
public function comments()
{
return $this->hasMany(Comment::class, 'article_id', 'idComment');
}
}
Dans cet exemple, un commentaire (Comment) appartient à un article (Article). La clé étrangère article_id dans la table des commentaires fait référence à la clé primaire idArticle dans la table des articles. Les méthodes article() dans le modèle Comment et comments() dans le modèle Article définissent la relation "BelongsTo" et "HasMany", respectivement. Vous pouvez ensuite accéder à l'article associé à un commentaire ou aux commentaires associés à un article de la même manière que dans les exemples précédents.
Exemple 3
une application de commerce électronique, où une commande appartient à un utilisateur. Les deux tables associées seront orders et users.
Migration pour la table orders :
// database/migrations/YYYY_MM_DD_create_orders_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateOrdersTable extends Migration
{
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->id('idOrder'); // Nommer la clé primaire avec idTable
$table->decimal('total_amount', 10, 2);
$table->unsignedBigInteger('user_id'); // Clé étrangère
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('orders');
}
}
Migration pour la table users :
// database/migrations/YYYY_MM_DD_create_users_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id('id'); // Nommer la clé primaire avec idTable
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
Modèle pour la table Order :
// app/Models/Order.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
protected $table = 'orders';
protected $primaryKey = 'idOrder'; // Nommer la clé primaire avec idTable
protected $fillable = ['total_amount', 'user_id'];
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
}
Modèle pour la table User :
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users';
protected $primaryKey = 'id'; // Nommer la clé primaire avec idTable
protected $fillable = ['name', 'email', 'password'];
public function orders()
{
return $this->hasMany(Order::class, 'user_id', 'idOrder');
}
}
Dans cet exemple, une commande (Order) appartient à un utilisateur (User). La clé étrangère user_id dans la table des commandes fait référence à la clé primaire id dans la table des utilisateurs. Les méthodes user() dans le modèle Order et orders() dans le modèle User définissent la relation "BelongsTo" et "HasMany", respectivement
Exemple 4
un blog avec un modèle plus avancé, où un commentaire peut appartenir à un utilisateur et à un article en même temps. Les tables associées seront comments, users, et articles.
Migration pour la table comments :
// database/migrations/YYYY_MM_DD_create_comments_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id('idComment'); // Nommer la clé primaire avec idTable
$table->text('content');
$table->unsignedBigInteger('user_id'); // Clé étrangère vers la table des utilisateurs
$table->unsignedBigInteger('article_id'); // Clé étrangère vers la table des articles
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('article_id')->references('idArticle')->on('articles');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('comments');
}
}
Migration pour la table users :
// database/migrations/YYYY_MM_DD_create_users_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id('id'); // Nommer la clé primaire avec idTable
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
Migration pour la table articles :
// database/migrations/YYYY_MM_DD_create_articles_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id('idArticle'); // Nommer la clé primaire avec idTable
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('articles');
}
}
Modèle pour la table Comment :
// app/Models/Comment.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
protected $table = 'comments';
protected $primaryKey = 'idComment'; // Nommer la clé primaire avec idTable
protected $fillable = ['content', 'user_id', 'article_id'];
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id');
}
public function article()
{
return $this->belongsTo(Article::class, 'article_id', 'idArticle');
}
}
Modèle pour la table User :
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $table = 'users';
protected $primaryKey = 'id'; // Nommer la clé primaire avec idTable
protected $fillable = ['name', 'email', 'password'];
public function comments()
{
return $this->hasMany(Comment::class, 'user_id', 'idComment');
}
}
Modèle pour la table Article :
// app/Models/Article.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $table = 'articles';
protected $primaryKey = 'idArticle'; // Nommer la clé primaire avec idTable
protected $fillable = ['title', 'content'];
public function comments()
{
return $this->hasMany(Comment::class, 'article_id', 'idComment');
}
}
Dans cet exemple, un commentaire (Comment) peut appartenir à un utilisateur (User) et à un article (Article) simultanément. La table comments contient deux clés étrangères, user_id faisant référence à la clé primaire id dans la table des utilisateurs, et article_id faisant référence à la clé primaire idArticle dans la table des articles. Les méthodes user() et article() dans le modèle Comment définissent les relations "BelongsTo" avec les modèles User et Article respectivement.