Laravel firstOrCreate、firstOrNew、updateOrCreate、insert

本文通过具体示例,不仅展示了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)

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小镇学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值