问题背景:
在写TDD的时候,我测试一个检查报名上限的方法,就是对一个报名信息在它插入数据库前,检查它是否到达报名限制,
然后在测试的时候要预先对数据库进行插值,
所有我用了一个for循环对一条数据进行重复插值:
$join=new Join();//报名信息的实例对象
$join=[
'XH'=>0,
'XM'=>'',
'GENDER'=>0,
'UNIT_ID'=>5,
'DEPTID'=>15,
'YEAR_ID'=>1,
'NUMBER'=>''
];
for($i=0;$i<9;$i++){//当前数据库没有院系id为15的数据,插入9条相同数据
$join->save();//将报名数据插入
}
我通过对实例对象赋值,然后调用save()保存至数据库,可实际情况却不是期待的插入9条相同数据,而只是插入了一条。
但如果采用下面这种方法却能够顺利插入9条数据:
$join=[
'XH'=>0,
'XM'=>'',
'GENDER'=>0,
'UNIT_ID'=>5,
'DEPTID'=>15,
'YEAR_ID'=>1,
'NUMBER'=>''
];
for($i=0;$i<9;$i++){//当前数据库没有院系id为15的数据,插入9条相同数据
Join::creat($join);//将报名数据插入
}
区别:
save():
- save()方法的调用必须先实例化对象,所有是非静态(static)方法;
- save()方法的功能是插入或更新(create or update),这个很重要,每一次调用方法都会查找当前的数据是否包含主键和数据表里是否包含当前主键,如果数据中没主键则获得一个自增的主键给当前对象,如果数据表中以存在该主键则更新该条数据;
- 返回值为 @return integer|false 整型或false。
creat():
- create()方法为静态方法;通过通过类直接调用;
- create()的功能为实例对象和插入(new and create);
- 返回值为当前模型的 实例对象。
原因:
save()方法只插入一条数据的原因是,但第一条数据被插入时之前实例好的对象在插入时被赋予了一个主键值,之后的操作由于主键相同就被方法判定为更新操作,导致数据库中只多了一条数据。
而create()方法每一次执行都生成一个实例对象,每一个对象都会得到一个不同的主键。