我创建了三个表用户,课程和user_courses,如下所示
CREATE TABLE `users` (
`id` bigint(20) 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,
`address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`status` enum('0','1') COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
CREATE TABLE `courses` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` text,
`description` text,
`price` varchar(255) DEFAULT NULL,
`schedule` varchar(255) DEFAULT NULL,
`duration` varchar(255) DEFAULT NULL,
`summary` text,
`skills` text,
`mode` enum('0','1') DEFAULT NULL COMMENT '0-Online 1 -Instructor',
`random_token` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
CREATE TABLE `user_courses` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT NULL,
`course_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
现在有了这些表,我想绑定关系,例如当我获取用户时,我能够为用户获取课程,当我到达课程时,我希望用户与课程相关联。 请帮助我如何实现它。
答案 0 :(得分:2)
我已经得到了答案,所以如果可以帮助任何人,请将其发布在此处。 这里的主要内容是分配多对多关系。在我的用户模型中,我定义了
public function courses()
{
return $this->belongsToMany('App\Course');
}
课程模型
public function users()
{
return $this->belongsToMany('App\User');
}
实际上,这取决于您希望如何使用这种关系。在代码的某些部分,您需要$ user->课程或更有可能查询$ course->用户或两者。 现在这里user_course表将被假定为数据透视表。所以在模型中,你可以把它写成
public function courses()
{
return $this->belongsToMany('App\Course', 'user_courses');
}
在这里你还可以指定特定数据透视表的字段的实际名称,即user_courses表。然后,我们要做的只是添加另外两个参数,首先是当前模型字段,然后添加字段模型加入像
public function courses()
{
return $this->belongsToMany('App\Course', 'user_courses','user_id', 'course_id');
}
So using the above model relationship you can easily fetch users with all the respective courses by
User::->with('courses')->get();
答案 1 :(得分:0)
首先,修复user_course表结构,user表的id为整数,而user_course在user_id中作为bigint引用。
首先要做的是在应用程序中创建模型。然后在模型中创建关系,最后使用这些关系。
使用命令行
php artisan make:model Course
php artisan make:model UserCourse
如果您愿意,可以手动创建它们。默认情况下,它们将在名为 App 的app文件夹中创建。例如,用户模型将是应用程序/用户,依此类推。
用户模型已经存在,因为它随laravel默认安装一起提供。
在用户模型中添加以下功能
public function courses()
{
$this->belongsToMany(Course::class, 'user_course');
}
如果您不打算在课程与用户之间建立一种崇敬的关系,则可以将课程模型留空。上面的定义了从用户到课程的关系
在控制器中说你可以用它作为
public function someFunctionInController()
{
$usersWithCourses = \App\User::with('courses')->get()->toArray();
//result of a single user record will look something like this
/**
[
'id' => 1,
'name' => 'some name'
... //other users table columns
//the courses will be an array of array content and will be automatically injected
'courses' => [[
'id' => 1 //the course id
... //course table columns,
'pivot' => [
'user_id' => 1,
'course_id' => 1
]
],[
'id' => 3 //the course id
... //course table columns,
'pivot' => [
'user_id' => 1,
'course_id' => 3
]
]]
]
**/
}