Laravel - Область действия - Ошибка преобразования типа данных nvarchar в числовой - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть модель под названием «Консоль», где у меня есть прицел, который выглядит следующим образом:

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();

При использовании этого область вместе с MS SQL, я получаю следующее сообщение об ошибке:

SQLSTATE [42000]: [Microsoft] [ODB C Драйвер 17 для SQL Сервер] [SQL Сервер] Ошибка преобразования типа данных nvarchar в число c. (SQL: выберите количество (*) в качестве агрегата из [consols], где [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")

При запуске этого запроса непосредственно в SQL Server Management Studio для фактической таблицы запрос выполняется отлично.

Ниже приведена схема для таблицы:

enter image description here

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вам нужно использовать 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"

0 голосов
/ 21 апреля 2020

Я исправил эту проблему с помощью метода whereRaw, который обеспечивает Laravel, так как я подозревал, что что-то "происходит за кулисами" с методом 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...