📜  laravel 添加多对多 - PHP (1)

📅  最后修改于: 2023-12-03 14:43:49.036000             🧑  作者: Mango

Laravel 添加多对多

在 Laravel 中,我们可以使用 Eloquent ORM 来创建多对多关系。本文将介绍如何在 Laravel 中创建多对多关系。

创建数据库表

首先,需要创建三个数据库表,分别是 usersrolesrole_user

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `roles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `role_user` (
  `role_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`role_id`, `user_id`),
  CONSTRAINT `role_user_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE,
  CONSTRAINT `role_user_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

以上脚本创建了 users 表、roles 表和 role_user 表。role_user 表是一个中间表,用于连接 roles 表和 users 表。

创建模型

在 Laravel 中,我们需要创建两个模型,分别是 User 模型和 Role 模型。这两个模型需要分别和 users 表和 roles 表进行关联。

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class)->withTimestamps();
    }
}

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class)->withTimestamps();
    }
}

以上模型分别定义了 UserRole 的多对多关系。

创建中间表记录

下面的代码演示如何创建一个新的角色,并将其分配给一个用户。

$user = User::find(1);
$role = Role::find(2);

$user->roles()->attach($role);

以上代码会在 role_user 表中创建一个新纪录。

获取中间表记录

下面的代码展示如何获取一个角色的所有用户。

$role = Role::find(1);

foreach ($role->users as $user) {
    echo $user->name;
}

以上代码会展示所有具有该角色的用户的名称。

移除中间表记录

下面的代码演示如何将一个角色从一个用户中删除。

$user = User::find(1);
$role = Role::find(2);

$user->roles()->detach($role);

以上代码会从 role_user 表中删除一个记录。

更新中间表记录

下面的代码演示如何更新一个角色的所有用户。

$role = Role::find(1);
$role->users()->sync([1, 2, 3]);

以上代码会在 role_user 表中更新记录,以使具有该角色的用户与提供的 ID 匹配。所有不在提供的 ID 中的记录都将被删除。

结论

多对多关系是 Laravel 中非常强大的功能之一。通过遵循本文中的步骤,您可以在 Laravel 中轻松地创建和管理多对多关系。