当将一个参数以整数形式传递时,Laravel返回零而不是实际的单元格值。

21 浏览
0 Comments

当将一个参数以整数形式传递时,Laravel返回零而不是实际的单元格值。

我有一个非常简单的MariaDB视图查询:

SELECT c.amount, c.discount 
FROM factors_view as c
WHERE c.factor_id = 358

当我在HeidiSQL中运行这个查询时,我得到的结果是:amount = 16000,discount = 1200

但是在Laravel 5.7的原始查询中:

$result = \DB::select("
   SELECT c.amount,c.discount 
   FROM factors_view as c
   WHERE c.factor_id = 358"
);

结果是:amount = 16000,discount = 0 当我在参数中加上引号时:

$result = \DB::select("
   SELECT c.amount,c.discount 
   FROM factors_view as c
   WHERE c.factor_id = '358'"
);

结果是:amount = 16000,discount = 1200

c.factor_id的类型是int(10) unsigned

这对我来说非常奇怪;因为差异在查询条件中,而不是选择中!

输出是同一行,但特定列的值为零!

有人知道发生了什么吗?

这是我两个查询的查询日志:

1)
query:"select `c`.`amount`, `c`.`discount` from `factors_view` as `c` where `c`.`factor_id` = ?"
bindings:[0:358]
2)
query:"select `c`.`amount`, `c`.`discount` from `factors_view` as `c` where `c`.`factor_id` = ?"
bindings:[0:"358"]

0
0 Comments

最终,我找到了这个麻烦的错误的原因。为了纠正这个错误,我在视图中改变了factor_id的类型:

CAST(factor_id AS UNSIGNED) AS factor_id

这样就能正常工作了。

虽然错误已经修复,但我仍然不明白这种行为。where条件应该影响行,而不是单元格的值。这可能是一个doctrine/dbal的bug?!

0
0 Comments

Laravel在将参数作为整数传递时返回零而不是实际的单元格值。这个问题的原因是`factor_id`字段的数据类型不正确,应该是整数类型(INT)而不是字符串类型(VARCHAR)。解决方法是将`factor_id`字段的数据类型更改为整数类型(INT)。

请提供`SHOW CREATE TABLE`的信息以便进一步分析。根据提供的信息,可以看出当参数作为整数传递时,索引可以正常使用,但当参数作为字符串传递时,索引无法使用,需要将字符串转换为整数,这会导致必须检查所有行。所以,正确的解决方法是将`factor_id`字段的数据类型更改为整数类型(INT)。

以下是示例代码:

ALTER TABLE your_table MODIFY factor_id INT;

通过将`factor_id`字段的数据类型更改为整数类型(INT),问题应该得到解决。

0