MySQL запрос в Laravel вдруг не работает - PullRequest
0 голосов
/ 12 ноября 2019

У меня есть приложение laravel, которое работает в течение 2,5 лет на размещенном сайте. Сегодня поле автозаполнения начало генерировать исключение для Connection.php

> SQLSTATE[42S22]: Column not found: 1054 Unknown column
> 'venues.details' in 'order clause'

Запрос:

SELECT *
FROM
  (SELECT `venues`.*,
          `a`.`street_number`,
          `a`.`longitude`,
          `a`.`latitude`,
          `p`.`code` AS `postal_code`,
          `s`.`name` AS `street`,
          `c`.`name` AS `city`,
          `st`.`name` AS `state`,
          `co`.`name` AS `country`,
          `co`.`sortname` AS `sortname`,
          `t`.`name` AS `timeZone`,
          `t`.`zone` AS `timeZoneName`,

          CONCAT(street_number, ' ', s.name, ' ', c.name, ', ', st.name, ', ', co.name) COLLATE utf8_bin AS address,
          CONCAT(venues.name, ' ', street_number, ' ', s.name, ', ', c.name, ', ', st.name, ', ', co.name) COLLATE utf8_bin AS details
   FROM `venues`
   INNER JOIN `addresses` AS `a` ON `a`.`id` = `address_id`
   INNER JOIN `streets` AS `s` ON `s`.`id` = `a`.`street_id`
   INNER JOIN `postalcodes` AS `p` ON `p`.`id` = `a`.`postalcode_id`
   INNER JOIN `cities` AS `c` ON `c`.`id` = `p`.`city_id`
   INNER JOIN `states` AS `st` ON `st`.`id` = `c`.`state_id`
   INNER JOIN `countries` AS `co` ON `co`.`id` = `st`.`country_id`
   INNER JOIN `timezones` AS `t` ON `t`.`id` = `a`.`timezone_id`
   WHERE `venues`.`deleted_at` IS NULL) AS venues
ORDER BY venues.details
LIMIT 15
OFFSET 0)

Если я запускаю этот запрос на консоли mysql, он работает так, как я ожидал. Я не менял (laravel) приложение или базу данных более года. Хостинг говорит, что ничего не изменилось.

Мне удалось заставить его работать, закомментировав сортировку:

$collate = ''; //, $collate = ' COLLATE utf8_bin ASC'
                $results = $builder
                        //->orderByRaw($column . $collate)
                        ->paginate();

Но я не могу понять, почему это не удается, но ручной запуск запроса работает(и что он отлично работал в течение 2 лет).

1 Ответ

1 голос
/ 12 ноября 2019

Что-то эзотерическое, подобное этому, иногда указывает на проблему с основным драйвером или серьезное изменение, вносимое в среду после исправления ОС. В прошлом я обнаружил обновление для cURL взлома веб-приложения PHP во время yum update для клиента, и мне пришлось откатывать этот отдельный пакет.

Кроме того, в настоящее время у вас есть:

SELECT *
FROM
  (SELECT `venues`.*, ... FROM `venues` INNER JOIN ...) AS venues
ORDER BY venues.details
LIMIT 15
OFFSET 0

Вы можете также рассмотреть вопрос об обновлении SQL для использования другого псевдонима для своего подзапроса, чтобы исключить возможность «забитости» с именем таблицы:

SELECT *
FROM
  (SELECT `venues`.*, ... FROM `venues` INNER JOIN ...) AS result
ORDER BY result.details
LIMIT 15
OFFSET 0

Обновление: Вы также можете посмотреть на использование с orderBy. Похоже, это связано: Столбец Laravel OrderByRaw не найден .

Кроме того, помимо аудита среды для последних обновлений пакета PHP и т. Д. Я бы попытался проверить реальный [предоставленный пользователем? ] введите это при сбое и получите дамп необработанного SQL (т. е. Как получить построитель запросов для вывода его необработанного SQL-запроса в виде строки? ) до или во время его выполнения для определения возможного SQLiэто также может испортить ваш запрос.

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