mysql中间表命名_mysql关联表中间表主表三张表的使⽤想了想我还是觉得在写⼀篇关于多对多的⽂档吧,因为我看了官⽅的⽂档写的不够细,不好理解。我⾃⼰也花了时间去看⼈家的⽂档还有⾃⼰⼜做了⼀些测试才知道怎么⽤的现在把我做测试的所有过程分享给⼤家。
数据库表与数据
就从数据库表开始啦,因为这样可能会更利于⼤家去理解。⼤家都知道数据库多对多关系都是需要三张表来完成的,⼀张主表,⼀张关联表,还有⼀张中间表。⽐如我们这⾥主表是学⽣表关联课程表。因为⼀个学⽣可以学多们课程,⼀门课程可以有多个学⽣来上课所以需要有⼀个中间表把他们关联起来。现在我就把今天需要做测试的⼏张表都贴出来,也⽅便⼤家在有不明⽩的时候可以拿来做测试。mysql操作官方文档
下⾯这张是学⽣表:
/*学⽣表*/
DROP TABLE IF EXISTS `pwn_student`;
CREATE TABLE pwn_student (
id INT AUTO_INCREMENT,
name VARCHAR(30),
age INT ,
class VARCHAR(50),
address VARCHAR(100),
PRIMARY KEY(id)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
/* 表数据 */
insert into pwn_student(name,age,`class`,address) values('学⽣A',15,'⼆班','a路2号');
insert into pwn_student(name,age,`class`,address) values('学⽣B',16,'⼆班','a路1号');
insert into pwn_student(name,age,`class`,address) values('学⽣C',15,'⼆班','B路1号');
中间表:
/
*学⽣课程关联表*/
DROP TABLE IF EXISTS `pwn_Stu_Cour`;
CREATE TABLE pwn_Stu_Cour(
id INT AUTO_INCREMENT,
stu_id INT ,
cour_id INT,
PRIMARY KEY(id)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
/*表数据*/
insert into pwn_Stu_cour(stu_id,cour_id) values(1,1);
insert into pwn_Stu_cour(stu_id,cour_id) values(2,2);
insert into pwn_Stu_cour(stu_id,cour_id) values(3,3);
insert into pwn_Stu_cour(stu_id,cour_id) values(1,1);
insert into pwn_Stu_cour(stu_id,cour_id) values(2,2);
insert into pwn_Stu_cour(stu_id,cour_id) values(3,3);
insert into pwn_Stu_cour(stu_id,cour_id) values(1,1);
insert into pwn_Stu_cour(stu_id,cour_id) values(2,2);
insert into pwn_Stu_cour(stu_id,cour_id) values(3,3);
insert into pwn_Stu_cour(stu_id,cour_id) values(1,1);
insert into pwn_Stu_cour(stu_id,cour_id) values(2,2);
insert into pwn_Stu_cour(stu_id,cour_id) values(3,3);
学⽣课程表
/
*学⽣课程表*/
DROP TABLE IF EXISTS `pwn_Course`;
CREATE TABLE `pwn_Course`(
`id` INT AUTO_INCREMENT NOT NULL,
`name` VARCHAR(150) NOT NULL DEFAULT '',
PRIMARY KEY(id)
)ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
/*表数据*/
insert into `pwn_course`(name) values('数学');
insert into `pwn_course`(name) values('语⽂');
insert into `pwn_course`(name) values('物理');
insert into `pwn_course`(name) values('化学');
insert into `pwn_course`(name) values('⽣物');
insert into `pwn_course`(name) values('英语');
如果有对数据库多对多关系有不明⽩的⼤家可以到⽹上去搜索⼀下因为今天主要讲的是TP5的关联模型,如果mysql也讲的话就内容太多了。
创建模型
在模型开始创建之前先给⼤家介绍⼀个⽅法,是thinkphp5关联模型多对多中需要使⽤到的⽅法 belongsToMany ⽅法。
belongsToMany⽅法的参数如下:
belongsToMany(‘关联模型名’,’中间表名’,’外键名’,’当前模型关联键名’,[‘模型别名定义’]);
关联模型名:
是指当前模型需要关联的其他模型,⽐如我们的当前模型是Student 摸⾏,去关联 Course 模型,那关
联模型就需要填course。
中间表名:
这个就不⽤说了,就是中间表名不⽤写前缀。
外键名:
是中间表 pwn_Stu_Cour 关联 course 表的外键id。
当前模型关联键名:
是中间表 pwn_Stu_Cour 关联 student 表的关联键名。
现在⼀切都准备好了之后接下来就进⼊今天的主题,创建tp模型。⼀般情况下⼀张表需要对应创建⼀个模型,但是多对多的关系⾥中间表的模型可以省略掉。也就是说我们只要创建学⽣表模型 Student 和课程表模型就可以了。
下⾯是Student模型
namespace app\index\model;
use think\Model;
class Student extends Model{
public function Course(){
//cour_id是关联中间表的关联course表的外键id,⽽stu_id也是中间表关联学⽣表的外键id
//两个id都是中间表关联其他表的外键id
//这个⼤家应该⼀看就知道都是中间表的id,因为在`pwn_student` 学⽣表和`pwn_Course`课程表⾥没有这两个字段。
return $this->belongsToMany('course','stu_cour','cour_id','stu_id');
}
}
>
这个模型上⾯ belongsToMany() ⽅法的参数什么相信⼤家都已经知道了吧,如果不知道的话回头到上⾯去看⼀下。
下⾯这个是 Course 模型
namespace app\index\model;
use think\Model;
class Course extends Model{
function Student(){
// return $this->belongsTo('Admin','aid','id');
// return $this->belongsToMany('student','stu_cour','cour_id','stu_id');
}
}
>
这个Course模型可以是空的不写任何⽅法但是不能没有不然会报错。
控制器调⽤:
关联新增
控制器调⽤模型和其他调⽤⽅法⼀样也是先⽤命名空间把他引⼊控制器然后调⽤
use app\index\model\Student;
namespace app\index\controller;
use think\Controller;
use app\index\model\Student;
class index extends Controller
{
/**
* @param string $name
*/
public function index($name='name')
{
//这的意思是从 pwn_student 学⽣表的name字段中取出'学⽣A'的信息
$student=Student::getByName('学⽣A');
//给关联表 pwn_course 新增⼀条 name 数据
$res= $student->Course()->save(['name'=>'地理']);
if($res){
echo "新增成功";
}
}
}
>
这样在 pwn_course 表⾥新增⼀条数在中间表⾥也会⾃动⽣成有对应关联id的数据,只要在模型中把中间表关联的id位置写对。
这是 pwn_course 表新增之前的数据:
这下⾯是中间表新增前的数据:
好现在刷新执⾏以下控制器看看效果,如果你的浏览器⾥显⽰成功并且没有任何报错就表⽰成功:
这是我的执⾏结果,我们看到它已经新增成功了。接下来看看数据库是不是也是成功了。
从图上可以看出我们新增的数据已经添加到了数据表⾥了。表⽰在这张表上⾯是没有问题的已经把数据添加上去了,但是我们还有⼀张把学⽣表和课程表关联起来很重要的中间表是否也添加成功了呢?接下来让我们到 pwn_Stu_Cour 中间表去看⼀下。
我们看到数据不仅是添加进去了!⽽且id都已经对号⼊座说明我们已经成功。
新增中间表数据
⽐如我们想给‘学⽣A’新增⼀门语⽂课。这个时候我们就需要添加中间表来完成新增‘学⽣A’的课程。还有⼀个是我们需要⽤模型Course 来获取课程信息所以这个时候 Course 表就不能是空的了。他需要关联 Student 模型,关联的⽅法和 Student ⼀样。
下⾯是 Course 模型:
namespace app\index\model;
use think\Model;
class Course extends Model{
function Student(){
// return $this->belongsTo('Admin','aid','id');
return $this->belongsToMany('student','stu_cour','stu_id','cour_id');
}
}
>
因为所有的⽅法参数都是和 Studen 模型是⼀样的所以我这⾥就不多介绍了。
下⾯是控制器⽅法:
namespace app\index\controller;
use think\Controller;
use app\index\model\Student;
use app\index\model\Course;
class index extends Controller
{
/
**
* @param string $name
*/
public function index($name='name')
{
//获取学⽣A的所有数据
$student = Student::getByName('学⽣A'); //获取学⽣A是信息
$course=Course::getByName('语⽂'); //获取语⽂信息
$res= $student->Course()->attach($course); //给中间表插⼊数据
if($res){
echo '新增成功';
}
}
}
>
好了,接下来我们刷新⼀下看看浏览器是不是显⽰新增成功了。
我们看到上图说明已经新增成功了。
然后‘学⽣A’的课程多了⼀些可能忙不过来,需要取消掉⼀些课程也是可以的。namespace app\index\controller;
use think\Controller;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论