在SQL Server中使用Laravel在事务内插入具有不同数据类型的语句失败

时间:2019-07-19 09:16:56

标签: sql sql-server laravel transactions sql-insert

名为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)中也可以很好地运行

设置

  • PHP 7.1
  • Debian 9(但Windows上也会出现问题)
  • SQL Server 2012
  • Laravel:5.8

我的问题

是否可以通过某种方式在全球范围内解决此问题,而不必求助于前面提到的任何修复程序?

由于它在SQL编辑器中可以正常工作,所以我认为它一定是Laravel问题或PHP SQL驱动程序问题?

1 个答案:

答案 0 :(得分:0)

这里的问题似乎是您的Laravel模型没有正确定义lines字段以映射到小数列。一种选择是使用模型(documentation)的casts属性:

protected $casts = [
    'lines' => 'real',
];

关于SQL Server方面的错误,我不知道为什么要尝试将文本转换为整数,但是在任何情况下,如果它不能进行隐式转换,都会抛出类似于此的错误