📜  多对多关系 laravel - PHP (1)

📅  最后修改于: 2023-12-03 15:37:51.664000             🧑  作者: Mango

多对多关系 Laravel - PHP

在 Laravel 框架中,多对多(Many-to-Many)关系是一种非常常见和有用的关系。本文将介绍在 Laravel 中如何处理多对多关系。

前置条件

在开始学习多对多关系之前,需要先熟悉 Laravel 框架的基础知识,包括路由、模型、控制器等。

多对多关系

在关系数据库中,多对多关系指的是两个实体之间存在多对多的关系,比如一个学生可以选修多个课程,而一个课程也可以被多个学生选修。在数据库中,通常使用第三张表来建立多对多关系。

在 Laravel 中,我们可以使用以下步骤建立多对多关系:

  1. 定义模型
  2. 定义关系
  3. 创建迁移
  4. 更新数据表
定义模型

首先,我们需要定义涉及到的模型。假设我们有两个模型,分别是 UserRole。这两个模型之间存在多对多的关系,也就是说一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。定义模型需要继承 Illuminate\Database\Eloquent\Model 类。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    //
}

class Role extends Model
{
    //
}
定义关系

在 Laravel 中,我们可以使用 belongsToMany() 方法定义多对多关系。这个方法需要传递两个参数,第一个参数是关联的模型类名,第二个参数是用来连接两张表的中间表名。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany('App\Role', 'user_role');
    }
}

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User', 'user_role');
    }
}
创建迁移

接下来,我们需要创建迁移来创建中间表。在 Laravel 中,我们可以使用 make:migration 命令来创建迁移。

php artisan make:migration create_user_role_table --create=user_role

创建迁移后,需要在迁移文件中定义中间表的字段。

<?php

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

class CreateUserRoleTable extends Migration
{
    public function up()
    {
        Schema::create('user_role', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users');
            $table->unsignedBigInteger('role_id');
            $table->foreign('role_id')->references('id')->on('roles');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('user_role');
    }
}
更新数据表

最后,运行迁移来更新数据表。

php artisan migrate

到此,多对多关系就建立好了。

使用关系

建立多对多关系后,我们可以使用关系来操作数据。比如,我们可以通过 $user->roles() 方法来获取用户的所有角色。

<?php

$user = App\User::find(1);

foreach ($user->roles as $role) {
    //
}

我们也可以通过 $role->users() 方法来获取拥有某个角色的所有用户。

<?php

$role = App\Role::find(1);

foreach ($role->users as $user) {
    //
}

当然,我们也可以使用其他方法来操作多对多关系,比如 attach()detach()sync()方法。

如果需要参照 Laravel 的官方文档可以参考以下链接:https://laravel.com/docs/8.x/eloquent-relationships#many-to-many