多对对关系
多对多的关系比一对一和一对多关系稍微复杂些。
如:
一个用户可以选择多门课程,一个课程可以被多个用户选择。
用户表和课程表之间就是一个多对多的关系;
一个用户可以拥有多个角色,一个角色可以被多个用户拥有;多对多的关系需要一个中间关系表来体现,如选课信息表。该表中记录哪个用户选了哪些课程信息。
多对多关系的创建语法:
多对多的关系不区分正向和反向
return $this -> belongsToMany(
被关联的模型 , 多对多模型的关系表名 , 中间表与当前模型关联的字段名 , 中间表与被关联模型关联的字段名);
示例:创建一个课程表和选课信息表如下:
课程表:
课程表course
id | 整型 | 课程id主键自增 |
---|---|---|
course_name | varchar | 课程名称 |
score | tinyint | 课程学分 |
选课信息表:
选课信息表 user_course
id | 整型 | 选课信息表主键自增 |
---|---|---|
user_id | 整型 | 用户id外键 |
course_id | 整型 | 课程id外键 |
用户表:
guest表
字段名 | 类型 | 说明 |
---|---|---|
id | int | 主键自增 |
username | 字符串(20) | 用户名 |
password | 字符串(20) | 密码 |
示例1:
建立 course表和guest表的多对多关系:
- 创建 course表的model模型类,guest表的model模型类:
php artisan make:model Course
php artisan make:model Guest
- 对两个模型类进行初始化设置:
Course 模型类:
Guest 模型类:class Course extends Model { use HasFactory; // 对模型初始化 protected $table = "course"; public $timestamps = false; // 建立关联关系 public function guest(){ // 后面的需要外键顺序是跟对应model相反的。 // 参数说明(关联表类,中间表名,当前model表的中间表对应字段,关联表的中间表对应字段) return $this->belongsToMany(Guest::class,"user_course","course_id","user_id"); } }
class Guest extends Model { use HasFactory; protected $table = 'guest'; public $timestamps = false; public function course(){ return $this->belongsToMany(Course::class,"user_course","user_id","course_id"); } }
- 需求示例:
创建一个控制器类:php artisan make:controller testControllers
- 查询某个用户选择的所有课程信息:
class testController extends Controller { public function getOne(){ // 获取用户名为admin的用户对应课程信息 $C_info = Guest::firstwhere("username","yumei")->course; foreach ($C_info as $v){ dump($v->toArray()); } }
发现里面多了一个pivot
字段,里面放着的是,guest
表和course
表在中间表的对应字段值 - 某个用户选择的课程数
class testController extends Controller { public function getOne(){ // 获取用户名为admin的用户对应课程信息 $C_info = Guest::firstwhere("username","yumei")->course; // 查看个数 // 方法一 直接统计数组个数: echo $C_info->count(); // 方法二:统计每个用户的选课个数:会多出一个course_count字段 $C_info = Guest::withCount('course')->get(); foreach ($C_info as $v){ dump($v->toArray()); } }
3. 选修某门课程的人数class testController extends Controller { public function getOne(){ //方法一: 获取UI设计课程对应的guest用户 $P_course = Course::firstwhere("course_name","UI设计")->guest; // 循环遍历 foreach ($P_course as $v) { dump($v->toArray()); } // 统计个数 echo $P_course->count(); // 方法二:直接用withCount统计course表中的数据,和guest表对应的个数,再通过where筛选出UI设计课程的结果 $P_course = Course::withCount("guest")->where("course_name","UI设计")->get(); foreach($P_course as $value) { dump($value->toArray()); } }
- 查询某个用户选择的所有课程信息: