Laravel中TelegramUser实体写入数据库时telegram_id数据错误问题
问题原因及解决方案
问题根源
你遇到的telegram_id存储错误,是大整数溢出导致的:Telegram用户ID是64位整数(比如5403205983),而32位PHP环境下的整数最大值是2147483647,超过这个值的整数会被截断,刚好5403205983 - 2^32 = 1108238687,和你数据库里存的数值完全匹配。
解决步骤
- 构建实体时强制转为字符串
修改Webhook数据处理代码里的telegram_id赋值,把ID转成字符串再存入实体:
$entity = [ 'telegram_id' => (string)$message['from']['id'], // 强制转字符串 'is_bot' => $message['from']['is_bot'], 'first_name' => $message['from']['first_name'], 'username' => $message['from']['username'], 'language_code' => $message['from']['language_code'], 'message' => $msg['msg'], 'context' => $msg['context'], ];
- 模型中明确字段类型
在TelegramUser模型里添加$casts属性,告诉Laravel把telegram_id当作字符串处理,避免自动转整数:
class TelegramUser extends Model { use HasFactory, TraitUuid; protected $fillable = ['telegram_id', 'is_bot', 'first_name', 'last_name', 'username', 'language_code', 'status']; protected $attributes = ['status' => 1]; // 新增这行 protected $casts = ['telegram_id' => 'string']; }
- 确认数据库字段类型
再次检查telegram_users表的telegram_id字段,确保它确实是varchar(255)类型,没有被误设为int或bigint(如果是bigint虽然能存,但字符串类型更稳妥,避免跨环境的整数溢出问题)。
额外提示
你实体里的message和context字段不在模型的$fillable数组里,所以调用create()时这两个字段会被Laravel过滤掉,如果需要存储这两个值,记得把它们添加到$fillable里:
protected $fillable = ['telegram_id', 'is_bot', 'first_name', 'last_name', 'username', 'language_code', 'status', 'message', 'context'];
内容的提问来源于stack exchange,提问作者user19739161
相关产品推荐
相关产品推荐

