Ошибка преобразования типа данных nvarchar в числовой при попытке создать запись с помощью Eloquent - PullRequest
0 голосов
/ 01 января 2019

У меня есть проект, который написан с использованием PHP поверх Laravel 5.7 framework.Я использую Eloquent ORM для взаимодействия с моим SQL Server.

Я пытаюсь использовать Model::insert([ [...] ]) и Model::create([...]) в модели Eloquent для создания отдельной записи или массовой записи.

Тем не менее, я получаю эту ошибку SQL-Server

SQLSTATE [42000]: [Microsoft] [Драйвер ODBC 13 для SQL Server] [SQL Server] Ошибка преобразования типа данных nvarchar в числовой.(SQL: вставить в TABLE_NAME

Я понимаю, в чем проблема. Но я не уверен, какой столбец вызывает проблему.

Можно ли получить необработанный SQL-запрос, которыйEloquent генерирует, так что я вижу, какие столбцы вызывают проблему?

Есть ли лучший способ выяснить причину этой проблемы?

В моей базе данных есть 4 столбца, которые не отображаются.Итак, я попытался определить их в свойстве $casts в модели Eloquent, например,

protected $casts = [
    'Bathrooms' => 'float',
    'Bedrooms' => 'float',
    'MatrixId' => 'int',
    'IntegrationId' => 'int',
    'Price' => 'float',
];

Но все равно получаю ту же ошибку.

Я также пытался установить laravel-debugbar , но не регистрирует запрос вставки. Возможно, из-за ошибки запрос не регистрируется.

Как я могу выяснить проблему?

1 Ответ

0 голосов
/ 02 января 2019

Если ваша конечная цель состоит в том, чтобы получить выполняемый запрос, то одним из решений было бы найти, где он пишет инструкцию INSERT, и умереть и вывести созданный им запрос.Поскольку у нас есть доступ к исходному коду, мы можем это сделать.

Вот где вы захотите посмотреть: \vendor\laravel\framework\src\Illuminate\Database\Query\Grammars\Grammar.php

В Grammer.php вы найдете функцию с именем compileInsert.

В конце у него есть return "insert into $table ($columns) values $parameters";

Настройте его на dd("insert into $table ($columns) values $parameters");, затем запишите запись в базу данных, и она должна показать созданный оператор INSERT.

В случае, если это полезно, я нашел файл, открыв проводник (я сейчас использую Windows), и в каталоге моего проекта laravel я искал «Eloquent».Лучший результат - каталог Eloquent.Затем я запустил в этом каталоге быструю команду powershell, чтобы увидеть, где может существовать INSERT INTO.

Get-ChildItem -recurse | Select-String -pattern "insert into" | group path | select name

4 файла были возвращены мне, и Grammar.php был победителем.

РЕДАКТИРОВАТЬ:

Я понял, что просто даетзапрос с "?"заполнители для значений.Попробуйте что-то вроде этого, чтобы вывести как запрос, так и вставляемые значения.Примечание. Я включил оператор if, чтобы он случайно не запускался на какой-то другой таблице, которая может быть вставлена ​​до того, как она попадет в ту часть процесса, которая вас интересует.

if ($table == "[your_table_name_here]") {
    dd(["insert into $table ($columns) values $parameters", $values]);
}

Это не даст полного необработанногоSQL, но вы должны быть в состоянии получить очень хорошее представление о том, что он в итоге выполняет.Если вам нужен необработанный SQL, все сводится к PDO в \vendor\laravel\framework\src\Illuminate\Database\Connection.php, функция statement.И я хотел бы задать вам этот вопрос для понимания этого: Получение необработанной строки запроса SQL из подготовленных операторов PDO

...