TP5 模型新增的返回值、返回值的判断以及所使用的SQL

TP5 模型新增主要使用静态方法 create 和动态方法 save 

静态方法 create 

直接使用模型类静态调用,例如 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) {
  }
}

动态方法 save

使用模型类实例动态调用,例如 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) ,否则会视为更新操作。

你可能感兴趣的:(笔记,教程,开发语言,php,Thinkphp)