为什么 firstOrCreate 返回数据与数据库不一致的解决
背景
用户表user
数据如下
openid | status | create_time |
---|---|---|
xxxxxxxxxx | 1 | 1585295158 |
在User
模型中有如下方法:
//根据openid获取或者创建用户
public static function getOrCreateUserByOpenid($openid) {
return self::select('status', 'openid', 'create_time')->firstOrCreate(['openid' => $openid]);
}
正常理解是User
表中存在数据则查询第一条符合条件的,不存在数据则创建一条新数据。但是本人在处理之后逻辑中发现此方法返回中字段openid
竟然为0
。Excuse me?这什么神仙操作
解决方案
laravel
中可自定义主键字段protected $primaryKey = 'openid';
but,问题就出在这里了,在本表中openid
并不是自增int
,程序会试图将查询结果转成int
总结
在User
模型中添加以下属性
public $incrementing = false; //是否自增
本作品采用《CC 协议》,转载必须注明作者和本文链接
不建议使用
openid
作为主键, 假设你现在是微信的openID
, 现在加个QQ
跟微博
之类的你想好了吗 :joy:字符串主键,太傻了 :joy: