为什么 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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

不建议使用 openid 作为主键, 假设你现在是微信的openID, 现在加个 QQ微博之类的你想好了吗 :joy:

4年前 评论
田园百晓生 (楼主) 4年前

字符串主键,太傻了 :joy:

4年前 评论
田园百晓生 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!