TP5 模型新增主要使用静态方法 create 和动态方法 save
直接使用模型类静态调用,例如 Test 模型类新增 username 为 a 的用户,如下
$data = ['username' => 'a'];
$result = TestModel::create($data);
生成的 SQL 如下
INSERT INTO `test` (`username`) VALUES ('a')
返回值
执行 create 方法成功则返回当前新增数据的模型类实例,失败则报错
重要提醒
执行 create 方法成功不代表新增数据成功,如果当前新增数据的字段名在数据库内是不存在的, create 方法是不会向数据库发送 SQL 语句的,如下
$test = new TestModel();
$data = ['name' => 'a'];
$result = TestModel::create($data);
因为模型在执行新增操作前,会发送一条 SQL 语句获得表结构,如下
SHOW COLUMNS FROM `test`
因为 name 字段在表结构中是不存在的,所以 create 方法是不会向数据库发送 SQL 语句的,而且 create 方法不会有任何错误提示,依然能返回新增数据的模型类实例,如下
object(app\index\model\Test)#43 (2) {
["data"]=>
array(1) {
["name"]=>
string(1) "a"
}
["relation"]=>
array(0) {
}
}
使用模型类实例动态调用,例如 Test 模型类实例新增 username 为 a 的用户,如下
$obj = new TestModel();
$data = ['username' => 'a'];
$result = $obj->save($data);
生成的 SQL 如下
INSERT INTO `test` (`username`) VALUES ('a')
返回值
V5.1.6+版本以前
save 方法返回新增的记录数
V5.1.6+版本以后
统一返回布尔值,如果执行 save 方法成功则返回 true(哪怕新增的行数是 0 也是返回 true ),并只有当 before_update 事件返回 false 的时候返回 false
重要提醒
1、从 V5.1.6+版本开始,save 方法只管执行 SQL 不管 SQL 执行后的结果,执行 SQL 成功则返回 true(哪怕新增的行数是 0 也是返回 true )
2、和静态方法 create 一样,执行 save 方法成功不代表新增数据成功,如果当前新增数据的字段名在数据库内是不存在的, save 方法是不会向数据库发送 SQL 语句的,如下
$data = ['name' => 'a']; // name 字段在表结构中是不存在的
$obj = new TestModel();
$result = $obj->save($data);
因为模型在执行新增操作前,会发送一条 SQL 语句获得表结构,如下
SHOW COLUMNS FROM `test`
因为 name 字段在表结构中是不存在的,所以 save 方法是不会向数据库发送 SQL 语句的,而且 save 方法不会有任何错误提示,依然能返回 true,如下
bool(true)
更重要提醒
save 方法会修改调用它的对象的数据
$user = new TestModel();
echo ("");
var_dump($user);
echo ("
");
//新增前的 Test 实例
object(app\index\model\Test)#43 (2) {
["data"]=>
array(0) {
}
["relation"]=>
array(0) {
}
}
//执行新增
$data = ['name' => 'a'];
$user->save($data);
echo ("");
var_dump($user);
echo ("
");
//执行新增后的 Test 实例
object(app\index\model\Test)#43 (2) {
["data"]=>
array(1) {
["name"]=>
string(1) "a"
}
["relation"]=>
array(0) {
}
}
如上,Test 类实例的 data 属性(数组)里多了一个 name ,和 save 方法新增数据库里的数据是保持一致的。
更更重要提醒
因为模型的新增方法和更新方法都是 save 方法,所以 tp5 框架有一套默认的规则来识别当前 save 方法要执行新增操作还是更新操作
1、不查询数据,直接模型对象调用 save 方法,表示新增
2、查询数据后调用 save 方法表示更新
3、save 方法传入更新条件表示更新
4、可以在执行 save 方法前执行 isUpdate ( false) 方法指定当前 save 方法执行新增操作
5、不要用同一个模型类实例执行多次 save 方法,如果确实需要多次新增,可以使用静态方法 create
6、如果你调用 save 方法进行多次数据新增,需要注意,第二次 save 方法的时候必须使用 isUpdate ( false) ,否则会视为更新操作。