名为lines
的数据库表只有1列price
class Line extends \Illuminate\Database\Eloquent\Model
{
protected $table = 'lines';
protected $guarded = ['id'];
}
+-------------+-----------+-------------------+-------------------------+---------------+
| COLUMN_NAME | DATA_TYPE | NUMERIC_PRECISION | NUMERIC_PRECISION_RADIX | NUMERIC_SCALE |
+-------------+-----------+-------------------+-------------------------+---------------+
| price | numeric | 19 | 10 | 3 |
+-------------+-----------+-------------------+-------------------------+---------------+
运行此代码时出现错误
DB::transaction(function() {
Line::insert([
['price' => 13.52],
['price' => 35]
]);
});
SQLSTATE [22018]:将nvarchar值'13 .52'转换为数据类型int时,[Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]转换失败。 (SQL:在[lines]([price])值中插入(13.52),(35))
我做了一些研究
如果我删除交易,则可以正常运行
如果我将值35
更改为35.00
,则效果很好
如果我将它们一一插入,也可以正常工作
如果在事务(insert into [lines] ([price]) values (13.52), (35)
中执行语句BEGIN TRANSACTION; .... COMMIT;
,则在多个SQL客户端(DBeaver,SQL Operations Studio)中也可以很好地运行
设置
我的问题
是否可以通过某种方式在全球范围内解决此问题,而不必求助于前面提到的任何修复程序?
由于它在SQL编辑器中可以正常工作,所以我认为它一定是Laravel问题或PHP SQL驱动程序问题?
答案 0 :(得分:0)
这里的问题似乎是您的Laravel模型没有正确定义lines
字段以映射到小数列。一种选择是使用模型(documentation)的casts
属性:
protected $casts = [
'lines' => 'real',
];
关于SQL Server方面的错误,我不知道为什么要尝试将文本转换为整数,但是在任何情况下,如果它不能进行隐式转换,都会抛出类似于此的错误