Неправильное форматирование таблицы для грамматики sqlserver - PullRequest
0 голосов
/ 02 октября 2018

Я использую конструктор запросов Laravel для извлечения некоторых данных из базы данных sqlsrv.Таблица, которую я ищу, это dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)].Не мой выбор.База данных разработана другой компанией.

Я получаю ошибку General error: 20018 Invalid object name при выполнении моего запроса.Я дважды проверил имя на наличие опечаток, но не смог его найти.

Что я обнаружил, так это проблему при компиляции запроса.Это мой код для проверки проблемы:

$query = $connection->query()
    ->from('Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)')
    ->toSql()

Когда я сбрасываю $query, я получаю следующее:

string(67) "select * from [Reukema Blocq Maneschijn BV$Time Slot ](Weighbridge)"

]здесь не в том месте.

Эта проблема сохраняется, даже когда я использую помощник raw():

$query = $connection->query()
    ->from($connection->raw('dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]'))
    ->toSql()

Даже в этом последнем примере ходы ]от конца строки до непосредственно перед (.

Почему это так?Мне не хватает важного правила / механизма для компиляции запросов sqlsrv?

Следующий код работает.Это делает меня странным:

$connection->select('select [Time Slot] as [id] from [Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]');

Так что я думаю, что в методе SqlServerGrammar@compileFrom что-то не так.Почему Laravel компилирует это так?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

После выполнения некоторых тестов с xDebug.Я нашел проблему.Это метод Illuminate\Database\Query\Grammars\SqlServerGrammer@wrapTableValuedFunction.

Laravel по ошибке видит мое имя таблицы как табличную функцию.Вот почему компиляция запроса не работает правильно.

Исправление, которое я использовал на данный момент, немного грязно:

$query = $connection->query()
    ->from('Reukema Blocq Maneschijn BV$Time Slot (Weighbridge) as time_slots')
    ->toSql()

Добавляя псевдоним в конец моего from метод, имя таблицы get скомпилировано другим способом.Это предотвращает компиляцию табличных функций.

Я не уверен, стоит ли сообщать об этом как об ошибке.Или, если имя таблицы, с которой мне приходится работать, просто неверно.

Редактировать: я сообщил об ошибке и создал исправление.Вы можете найти вопрос (и PR) здесь

0 голосов
/ 02 октября 2018

Лично я очень рекомендую изменить имя объекта;это ужасный выбор.Если вы не можете сделать это, возможно, создайте синоним, который будет гораздо более «пригодным для использования».Например:

CREATE SYNONYM dbo.WeighbridgeSlot FOR dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)];

Затем в коде приложения вместо этого используйте синоним:

$query = $connection->query()
    ->from('WeighbridgeSlot')
    ->toSql()
...