Laravel Livewire线上环境读取null的id属性报错,本地正常
问题排查方案
核心原因分析
你遇到的「Attempt to read property "id" on null」本质是Barang::where('barcode', $this->barcode)->first()返回了null——尽管$this->barcode值正确,但线上数据库中匹配不到对应数据,或查询逻辑存在环境差异。
具体排查步骤
- 直接验证数据库数据:登录线上数据库,执行SQL语句
SELECT * FROM barang WHERE barcode = '你确认的有效barcode值';,确认是否存在对应记录。如果没有,说明线上数据库缺少该商品数据,同步本地数据即可。 - 检查barcode的格式差异:
- 对比线上数据库中barcode字段值与传递的
$this->barcode,看是否存在前后空格(比如用户输入时的空格未处理)、大小写差异(比如本地是ABC123,线上是abc123)。 - 若存在格式问题,可在查询前对barcode做标准化处理:
Barang::where('barcode', trim(strtolower($this->barcode)))->first()。
- 对比线上数据库中barcode字段值与传递的
- 核对数据库字符集/排序规则:
- 执行
SHOW CREATE TABLE barang;查看表的COLLATE字段,对比本地与线上的配置。比如本地用utf8mb4_general_ci(不区分大小写),线上用utf8mb4_bin(区分大小写),会导致大小写不同的barcode无法匹配。 - 若规则不一致,可修改线上表的排序规则为与本地一致:
ALTER TABLE barang MODIFY COLUMN barcode VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;(根据实际字段长度调整)。
- 执行
- 排查软删除问题:如果
Barang模型使用了SoftDeletestrait,检查线上数据的deleted_at字段是否有值。若商品被软删除,需要在查询中加入->withTrashed()才能获取到记录。 - 验证数据类型匹配:
- 查看
barang表中barcode字段的类型(比如VARCHAR还是INT),同时在SearchBarang的submit方法中打印var_dump($this->barcode, gettype($this->barcode)),确认传递的barcode类型与数据库字段类型一致。 - 比如数据库中barcode是带前导零的字符串(如
00123),但传递的是数字123,会导致查询不到,此时需要将传递的值转为字符串:Barang::where('barcode', (string)$this->barcode)->first()。
- 查看
- 确认数据库连接配置:检查线上环境的
.env文件,确认DB_DATABASE等参数指向的是正确的生产数据库,避免连接到测试库导致数据缺失。
内容的提问来源于stack exchange,提问作者Muzakir Nur
相关产品推荐
相关产品推荐

