Sql server Laravel-作用域-将数据类型nvarchar转换为数字时出错

Sql server Laravel-作用域-将数据类型nvarchar转换为数字时出错,sql-server,laravel,Sql Server,Laravel,我有一个名为“Console”的模型,其中的作用域如下所示: public function scopeOfFinalsSent($query, $set) { if ($set) { return $query->whereNotNull('finals_sent')->where(function ($query) { $query->where('final_weight', '>=', 'current_weigh

我有一个名为“Console”的模型,其中的作用域如下所示:

public function scopeOfFinalsSent($query, $set)
{
    if ($set) {

        return $query->whereNotNull('finals_sent')->where(function ($query) {
            $query->where('final_weight', '>=', 'current_weight')
                ->where('final_cbm', '>=', 'current_cbm');
        });
    }

    return $query;
}
我是这样使用它的:

public function scopeOfFinalsSent($query, $set)
{
    if ($set) {

        return $query->whereNotNull('finals_sent')->where(function ($query) {
            $query->where('final_weight', '>=', 'current_weight')
                ->where('final_cbm', '>=', 'current_cbm');
        });
    }

    return $query;
}
返回控制台::OFFINALSENT(true)->count();
当与MSSQL一起使用此作用域时,我得到以下错误:

SQLSTATE[42000]:[Microsoft][ODBC驱动程序17 for SQL Server][SQL Server]将数据类型nvarchar转换为数字时出错。(SQL:从[consols]中选择计数(*),其中2020-04-20和2020-04-26之间的[first_etd]和[final_sent]不为空且([final_weight]>=当前_weight和[final_cbm]>=当前_cbm))

请注意,如果我切换到MySQL,我不会得到上面的错误

我尝试在我的作用域上使用
toSql()
方法调试实际查询。我正在执行的查询如下所示:

public function scopeOfFinalsSent($query, $set)
{
    if ($set) {

        return $query->whereNotNull('finals_sent')->where(function ($query) {
            $query->where('final_weight', '>=', 'current_weight')
                ->where('final_cbm', '>=', 'current_cbm');
        });
    }

    return $query;
}
select*from[consols],其中'2020-04-20'和'2020-04-26'之间的[first_etd]和[final_sent]不为空且([final_weight]>=“current_weight”和[final_cbm]>=“current_cbm”)
当直接在SQLServerManagementStudio中对实际表运行此查询时,查询的执行非常完美

下面可以看到该表的架构:


我通过使用Laravel提供的
whereRaw
方法解决了这个问题,因为我怀疑
where
方法“幕后发生了什么”

我的范围现在看起来是这样的(注意使用的是
whereRaw
,而不是
where
):

公用函数scopeofnalssent($query,$set)
{
若有($套){
return$query->whereNotNull('finals_sent')->where(函数($query){
$query->WHERRAW('最终重量>=当前重量')
->其中,原始(“最终煤层气>=当前煤层气”);
});
}
返回$query;
}

您需要使用
whereColumn
来比较列的值,在您的情况下:

公用函数scopeofnalssent($query,$set)
{
若有($套){
return$query->whereNotNull('finals_sent')->where(函数($query){
$query->whereColumn('final\u weight','>=','current\u weight')
->其中第列(“最终”cbm“,“>=”,“当前”cbm”);
});
}
返回$query;
}

否则,你最终会将
最终权重
与字符串值
进行比较,“当前权重”

比我快20秒。我还是更喜欢你的答案,因为你使用的是
whereColumn
,因此在我眼里它更清晰。