SQlite НЕ выбрасывает исключения для неизвестных столбцов в предложении where - PullRequest
0 голосов
/ 29 сентября 2018

Немного предыстории: я создаю приложение на Laravel 5.6.33 (PHP 7.2 с sqlite 3).

Итак, у меня есть странный случай, когда в тесте я ожидаю исключения, но оно никогда не генерируется.Поэтому я начал копать и обнаружил, что Laravel не создает исключений для недопустимых / несуществующих столбцов в предложении where, если драйвер базы данных - sqlite.Следующий код просто возвращает пустую коллекцию вместо того, чтобы выдавать исключение.

\App\Tag::where('notAColumn', 'foo')->get();

Это странно, и я проверил повсеместно, чтобы убедиться, что это не так с моей конфигурацией, и не нашел ничего неуместного.Debug установлен в true и т. Д. Я запускаю этот код для тестирования приложения с использованием базы данных sqlite в памяти.

Еще одна вещь, которую я заметил, заключалась в том, что если я использую whereRaw вместо where, исключения выдаются, как и ожидалось.так, например, следующее выдает исключение.

\App\Tag::whereRaw('notAColumn = "foo"')->get();

Кто-нибудь знает, почему это возможно?

1 Ответ

0 голосов
/ 29 сентября 2018

Разница между вашими двумя запросами заключается в (не) заключении в кавычки имени столбца:

Tag::where('notAColumn', 'foo')->get();
// select * from "tags" where "notAColumn" = 'foo'

Tag::whereRaw("notAColumn = 'foo'")->get(); // Literals are wrapped in single quotes.
// select * from "tags" where notAColumn = 'foo'

Из документации :

Еслиключевое слово в двойных кавычках (например, «ключ» или «глобус») используется в контексте, где оно не может быть преобразовано в идентификатор, но где допускается строковый литерал, тогда токен понимается как строковый литерал вместоидентификатор.

Таким образом, SQLite интерпретирует Tag::where('notAColumn', 'notAColumn')->get(); как сравнение двух (идентичных) строк и поэтому возвращает все строки в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...