今天在使用 laravel 10 的模型查询遇到一个问题?想请教下是什么原因。
$orderRefund = OrderRefund::query()
->where('order_no', $orderNo)
->where('refund_status', RefundStatusEnum::PROCESSING)
->first();
dump($orderRefund);exit();
上面这个查询结果打印为 nullorder_no
数据库字段类型为 bigintrefund_status
数据库字段类型为 tinyint
然后使用打印出来的sql 语句去出数据库查询是能查出数据的
$orderRefundSql = OrderRefund::query()
->where('order_no', $orderNo)
->where('refund_status', RefundStatusEnum::PROCESSING)
->toRawSql();
dump($orderRefundSql);exit();
select * from `order_refunds` where `order_no` = '64795467258662912' and `refund_status` = 0
拿这个 sql 语句去查询是有结果集的。
但是下面这个写法又能查询出数据,就是将 $orderNo
转化为int 类型
$orderRefund = OrderRefund::query()
->where('order_no', (int)$orderNo)
->where('refund_status', RefundStatusEnum::PROCESSING)
->first();
dump($orderRefund);exit();
就是想想知道产生这个问题的原因时什么。
$orderRefund = OrderRefund::query()
->where('order_no', $orderNo)
->first();
$orderRefund = OrderRefund::query()
->whereRaw("order_no = ?", [$orderNo])
->where('refund_status', RefundStatusEnum::PROCESSING)
->first();
这2中写法都是能正常查出数据的
应 @Rache1 的建议,
我贴一下 PHP 版本和 MySQL 版本及建表语句
laravel/framework”: “^10.10”,php 8.2.18, MySql 8.0.24,字符集 utf8mb4 排序规格utf8mb4_unicode_ci
下面建表语句,这个是无法正常查出数据的
CREATE TABLE `order_refunds` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_no` bigint unsigned NOT NULL COMMENT '订单号',
`is_apply_refund` tinyint unsigned NOT NULL COMMENT '是否申请退款:1是,0否',
`refund_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '退款金额',
`refund_status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '退款状态:0退款中,1退款成功,2退款失败',
`refund_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退款原因',
`refund_desc` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退款说明',
`refund_images` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退款图片',
`review_result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核结果',
`review_time` datetime DEFAULT NULL COMMENT '审核时间',
`additional_data` json DEFAULT NULL COMMENT '附加数据',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uni_order_no` (`order_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单退款信息表';
下面的是能正常查出数据的,只是把refund_status
变更为了有符号的整型
CREATE TABLE `order_refunds` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_no` bigint unsigned NOT NULL COMMENT '订单号',
`is_apply_refund` tinyint unsigned NOT NULL COMMENT '是否申请退款:1是,0否',
`refund_amount` decimal(10,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '退款金额',
`refund_status` tinyint NOT NULL DEFAULT '0' COMMENT '退款状态:0退款中,1退款成功,2退款失败',
`refund_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退款原因',
`refund_desc` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退款说明',
`refund_images` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退款图片',
`review_result` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核结果',
`review_time` datetime DEFAULT NULL COMMENT '审核时间',
`additional_data` json DEFAULT NULL COMMENT '附加数据',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uni_order_no` (`order_no`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单退款信息表';
不过这个问题也引起了我的注意,order_no 以后尽量使用把 varchar,以前项目基本都是varchar,所以没有遇到过此类问题, AI 有时候的建议也不是挺靠谱的,而且 bigint 类型在前端有时候显示也会有问题。但是其实 ID 大了该处理还是处理,由于 PHP 本身就是弱类型,还是需要写的时候更加规范,避免这类 BUG 的发生把。
推荐文章: