本文通过具体示例,不仅展示了firstOrCreate、firstOrNew、updateOrCreate、insert四种用法的区别,也间接说明了CREATED_AT、UPDATED_AT的用法,还请大家仔细体会。
// 定义模型
namespace App\Model;
class User extends BaseModel
{
protected $table = 'user';
public $timestamps = true;
const CREATED_AT = 'create_time';
const UPDATED_AT = 'last_login_time';
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
}
}
1.使用firstOrCreate()
// 记录不存在
public function testFirstOrCreate()
{
$rs = User::firstOrCreate([
'actorgid' => '11111111',
'user_id' => '1234567',
], ['phone' => 15911112222]);
var_export($rs->toArray());
}
输出结果:
array (
'actorgid' => '11111111',
'user_id' => '1234567',
'phone' => 15911112222,
'last_login_time' => '2020-10-15 16:01:42',
'create_time' => '2020-10-15 16:01:42',
'id' => 267592,
)
注:通过sql日志可以看到,这里返回的是参与insert的字段以及insert之后的返回值id;
sql执行日志:
2020-10-15 16:01:42: select * from `user` where (`actorgid` = '11111111' and `user_id` = '1234567') limit 1
2020-10-15 16:01:42: insert into `user` (`actorgid`, `user_id`, `phone`, `last_login_time`, `create_time`) values ('11111111', '1234567', 15926292222, '2020-10-15 16:01:42', '2020-10-15 16:01:42')
// 如果已经存在,则返回该记录
public function testFirstOrCreate2()
{
$rs = User::firstOrCreate([
'actorgid' => '11111111',
'user_id' => '1234567',
], ['phone' => 15926292223]);
var_export($rs->toArray());
}
输出结果:
array (
'id' => 267592,
'actid' => 0,
'actorgid' => 11111111,
'user_id' => 1234567,
'phone' => '15911112222',
'last_login_time' => '2020-10-15 16:01:42',
'create_time' => '2020-10-15 16:01:42',
)
sql执行日志:
2020-10-15 16:14:08: select * from `user` where (`actorgid` = '11111111' and `user_id` = '1234567') limit 1
2.使用firstOrNew()
// 记录不存在, 则创建
public function testFirstOrNew()
{
$model = User::firstOrNew([
'actorgid' => '11111111',
'user_id' => '3001',
], ['phone' => 15926293001]);
$rs = $model->save();
var_export($rs);
}
输出结果:
true
sql执行日志:
2020-10-15 16:22:18: select * from `user` where (`actorgid` = '11111111' and `user_id` = '3001') limit 1
2020-10-15 16:22:18: insert into `user` (`actorgid`, `user_id`, `phone`, `last_login_time`, `create_time`) values ('11111111', '3001', 15926293001, '2020-10-15 16:22:18', '2020-10-15 16:22:18')
// 记录存在则更新的用法
public function testFirstOrNew2()
{
$params = [
'phone' => 15926293003
];
$model = User::firstOrNew([
'actorgid' => '11111111',
'user_id' => '3001',
], $params);
if ($model->id) {
$params['last_login_time'] = date('Y-m-d H:i:s');
$model->fill($params);
}
$model->save();
}
sql执行日志:
2020-10-15 15:31:42: select * from `user` where (`actorgid` = '11111111' and `user_id` = '3001') limit 1
2020-10-15 15:31:42: update `user` set `phone` = 15926293003, `last_login_time` = '2020-10-15 15:31:42' where `id` = 267589
注:如果手机号没有变化,update的时候就不会带手机号
3.updateOrCreate()
// 记录不存在则创建
public function testUpdateOrCreate()
{
$rs = User::updateOrCreate([
'actorgid' => '11111111',
'user_id' => '3002',
], ['phone' => 15911112222]);
var_export($rs->toArray());
}
输出结果:
array (
'actorgid' => '11111111',
'user_id' => '3002',
'phone' => 15911112222,
'last_login_time' => '2020-10-15 16:28:30',
'create_time' => '2020-10-15 16:28:30',
'id' => 267594,
)
sql执行日志:
2020-10-15 16:28:30: select * from `user` where (`actorgid` = '11111111' and `user_id` = '3002') limit 1
2020-10-15 16:28:30: insert into `user` (`actorgid`, `user_id`, `phone`, `last_login_time`, `create_time`) values ('11111111', '3002', 15926293002, '2020-10-15 16:28:30', '2020-10-15 16:28:30')
// 记录存在则更新
public function testUpdateOrCreate2()
{
$rs = User::updateOrCreate([
'actorgid' => '11111111',
'user_id' => '3002',
], ['phone' => 15911112222]);
var_export($rs->toArray());
}
输出结果:
array (
'id' => 267594,
'actid' => 0,
'actorgid' => 11111111,
'user_id' => 3002,
'phone' => 15911112222,
'last_login_time' => '2020-10-15 16:30:48',
'create_time' => '2020-10-15 16:28:30',
)
sql执行日志:
2020-10-15 16:30:48: select * from `user` where (`actorgid` = '11111111' and `user_id` = '3002') limit 1
2020-10-15 16:30:48: update `user` set `phone` = 15911112222, `last_login_time` = '2020-10-15 16:30:48' where `id` = 267594
4.使用insert()
public function testInsert()
{
$flag = User::insert([
'actorgid' => '11111111',
'user_id' => '12345678',
'phone' => 15911112222
]);
echo $flag;
}
输出结果:
1
sql执行日志:
2020-10-15 16:44:06: insert into `user` (`actorgid`, `user_id`, `phone`) values ('11111111', '12345678', 15911112222)
参考链接