thinkphp初学者教程:一对多模型关联
1.前言
上一节介绍了如何使用一对一的模型将教师信息链接到课程列表。本节介绍如何在学生课程关联列表中使用一对多模型。关联学生选课信息,一对多模型关联主要是针对查询具有一对多关系的两张表,联表查询会带来性能问题。 这里复用了上一节的控制器。只需要为学生排班列表定义一条路线: 如下图: 如下图所示: ,StudentModel ThinkPHP
提供了()方法用于预加载此类链表查询。当一对多模型关联时,框架底层会使用主驱动表的
可以在id
集合到另一个表 IN
查询取所有数据在一次即可自动对应。这种操作减少了开发人员编写大量循环和数据处理代码的需要。 ? SQL
添加学生表数据如下:
如下图:
L♿ 添加学生课程语句如下:
如下图所示:
3. 定义路由
代码块//学生课程表关联列表接口
Route::get('course-students','app\controller\Study\CourseController@courseStudnetList');
4。方法定义
代码块 /**
* 学生课表信息关联表
* @return \think\response\Json
*/
public function courseStudnetList(){
//每页条数
$size = (int)$this->request->param('size', 15);
$courseStudents = StudentModel::order('created_at DESC')
->with('course_students')
->paginate($size);
return json($courseStudents);
}
5.在
中指定一对多模型关联方法
课程中定义学生
代码方法:
6。通过模型关联请求数据
使用如下 postman
请求接口数据如下:
{
"total": 14,
"per_page": 10,
"current_page": 1,
"last_page": 2,
"data": [
{
"id": 1,
"name": "赵雷",
"age": 24,
"id_number": "42011720100506XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 1,
"student_id": 1,
"course_id": 1,
"created_at": 1603617951
},
{
"id": 2,
"student_id": 1,
"course_id": 2,
"created_at": 1603617951
},
{
"id": 3,
"student_id": 1,
"course_id": 2,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 2,
"name": "孙空",
"age": 23,
"id_number": "42011720110606XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 4,
"student_id": 2,
"course_id": 3,
"created_at": 1603617951
},
{
"id": 5,
"student_id": 2,
"course_id": 4,
"created_at": 1603617951
},
{
"id": 6,
"student_id": 2,
"course_id": 6,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 3,
"name": "钱学",
"age": 18,
"id_number": "42011720120306XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 7,
"student_id": 3,
"course_id": 4,
"created_at": 1603617951
},
{
"id": 8,
"student_id": 3,
"course_id": 1,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 4,
"name": "王五",
"age": 25,
"id_number": "42011720030506XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 9,
"student_id": 4,
"course_id": 1,
"created_at": 1603617951
},
{
"id": 10,
"student_id": 4,
"course_id": 3,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 5,
"name": "张红",
"age": 19,
"id_number": "42011720050506XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 11,
"student_id": 5,
"course_id": 5,
"created_at": 1603617951
},
{
"id": 12,
"student_id": 5,
"course_id": 6,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 6,
"name": "吴晓明",
"age": 21,
"id_number": "42011720040506XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 13,
"student_id": 6,
"course_id": 4,
"created_at": 1603617951
},
{
"id": 14,
"student_id": 6,
"course_id": 2,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 7,
"name": "李珍",
"age": 25,
"id_number": "42011720060206XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [
{
"id": 15,
"student_id": 7,
"course_id": 3,
"created_at": 1603617951
},
{
"id": 16,
"student_id": 7,
"course_id": 4,
"created_at": 1603617951
}
],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 8,
"name": "猪刚",
"age": 22,
"id_number": "42011720070806XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 9,
"name": "李亮",
"age": 26,
"id_number": "42011720080906XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [],
"created_at_text": "2020-10-25 17:25"
},
{
"id": 10,
"name": "周康",
"age": 28,
"id_number": "42011720000706XXXX",
"created_at": 1603617951,
"update_at": 0,
"status": 1,
"course_students": [],
"created_at_text": "2020-10-25 17:25"
}
]
}
代码块如下图:。总结
本节主要介绍一对多模型关联。使用with
预加载的底层实现是IN
查询,因此无需担心循环搜索问题。此外,如果您需要继续链接上述结果中的课程信息,您可以使用 和
关闭查询,如下所示:
/**
* 学生课表信息关联表
* @return \think\response\Json
*/
public function courseStudnetList(){
//每页条数
$size = (int)$this->request->param('size', 15);
$courseStudents = StudentModel::order('created_at DESC')
->with(['course_students' => function($query){
$query->with('course');
}])
->paginate($size);
return json($courseStudents);
}
代码块 ,您需要在其中创建新的 课程在
一对一相关的课程信息。 CourseStudentModel
模型
提示:代码存储库:https://gitee.com/love-for-poetry/tp6
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。