📅  最后修改于: 2023-12-03 14:43:49.036000             🧑  作者: Mango
在 Laravel 中,我们可以使用 Eloquent ORM 来创建多对多关系。本文将介绍如何在 Laravel 中创建多对多关系。
首先,需要创建三个数据库表,分别是 users
、roles
和 role_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();
}
}
以上模型分别定义了 User
和 Role
的多对多关系。
下面的代码演示如何创建一个新的角色,并将其分配给一个用户。
$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 中轻松地创建和管理多对多关系。