You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中TelegramUser实体写入数据库时telegram_id数据错误问题

问题原因及解决方案

问题根源

你遇到的telegram_id存储错误,是大整数溢出导致的:Telegram用户ID是64位整数(比如5403205983),而32位PHP环境下的整数最大值是2147483647,超过这个值的整数会被截断,刚好5403205983 - 2^32 = 1108238687,和你数据库里存的数值完全匹配。

解决步骤

  1. 构建实体时强制转为字符串
    修改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'],
];
  1. 模型中明确字段类型
    在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'];
}
  1. 确认数据库字段类型
    再次检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:10:38