我有一个名为"Consol“的模型,其中我有一个类似于这样的范围:
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;
}我就是这样用的:
return Consol::ofFinalsSent(true)->count();当将此作用域与MSSQL一起使用时,我会得到以下错误:
SQLSTATE42000:将数据类型nvarchar转换为数字的MicrosoftSQL ServerError。(SQL:从控制台中选择count(*)作为聚合,其中first_etd在2020-04-20和2020-04-26之间,finals_sent不为空,并且(final_weight >= current_weight和final_cbm >= current_cbm))
请注意,如果我切换到MySQL,我不会得到上述错误。
我已经尝试使用toSql()方法在我的作用域上调试实际的查询。我正在执行的查询如下所示:
select * from [consols] where [first_etd] between '2020-04-20' and '2020-04-26' and [finals_sent] is not null and ([final_weight] >= "current_weight" and [final_cbm] >= "current_cbm")当在实际表上的中直接运行此查询时,将完美地执行该查询。
下面可以看到表的架构:

发布于 2020-04-21 11:53:23
您需要使用whereColumn来比较列的值,在您的示例中:
public function scopeOfFinalsSent($query, $set)
{
if ($set) {
return $query->whereNotNull('finals_sent')->where(function ($query) {
$query->whereColumn('final_weight', '>=', 'current_weight')
->whereColumn('final_cbm', '>=', 'current_cbm');
});
}
return $query;
}否则,您最终会将final_weight之类的内容与字符串值"current_weight"进行比较。
发布于 2020-04-21 11:53:00
我通过使用Laravel提供的whereRaw方法解决了这个问题,因为我怀疑where方法“正在幕后进行”。
我的作用域现在看起来如下(注意使用的是whereRaw而不是where ):
public function scopeOfFinalsSent($query, $set)
{
if ($set) {
return $query->whereNotNull('finals_sent')->where(function ($query) {
$query->whereRaw('final_weight >= current_weight')
->whereRaw('final_cbm >= current_cbm');
});
}
return $query;
}https://stackoverflow.com/questions/61342683
复制相似问题