Ошибка в работе с базой данных в запросе с JOIN Laravel v5?

Делаю выборку из бд (здесь только часть кода, при выполнении которого возникает ошибка)
if(count($rgColl) > 0){
                $this->projects->join('object_collection', function($join) use($rgColl){
                    $join->on('object_collection.object_id', '=', 'objects.id');
                    if(count($rgColl) == 1){
                        $join->where('object_collection.collection_id', '=', $rgColl[0]);
                    } else {
                        $join->whereIn('object_collection.collection_id', $rgColl);
                    }
                });
                $this->select[] = 'object_collection.object_id';
                $this->select[] = 'object_collection.collection_id';
                $this->group[]  = 'object_collection.object_id';
            }

Если в $rgColl 1 элемент, то все ок, результат возвращается нормально,
если выполняется конструкция $join->whereIn('object_collection.collection_id', $rgColl);
выдает ошибку
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? where `objects`.`category_id` = ? group by `object_parameters_size`.`object_id' at line 1

Беру код запроса сгенерированный ларой, и просто выполню его в MySQL Workbench, все круто, данные возвращаются
Полный запрос выглядит так
SELECT 
    `objects`.`id`,
    `objects`.`ord`,
    `objects`.`title`,
    `objects`.`art`,
    `objects`.`code`,
    `object_parameters_size`.`object_id`,
    `object_parameters_size`.`parameter_id`,
    `object_parameters_size`.`valint`,
    `object_collection`.`object_id`,
    `object_collection`.`collection_id`
FROM 
	`objects`
	INNER JOIN `object_parameters` AS `object_parameters_size` ON `object_parameters_size`.`object_id` = `objects`.`id`
		AND `object_parameters_size`.`parameter_id` = 1
		AND `object_parameters_size`.`valint` > 0
		AND `object_parameters_size`.`valint` < 500
	INNER JOIN `object_collection` ON `object_collection`.`object_id` = `objects`.`id`
        AND `object_collection`.`collection_id` IN (38,15,39,40,41)
WHERE
    `objects`.`category_id` = 1
GROUP BY `object_parameters_size`.`object_id` , `object_collection`.`object_id`
ORDER BY `objects`.`ord` ASC

Аномалия какая-то получается.
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
vlom88
@vlom88 Автор вопроса
Разобрался в чем тут была проблема. Суть в следующем
В классе Illuminate\Database\Query\JoinClause не было метода whereIn, как для основного тела запроса. Я его дописал, да немного не правильно
Изначально строка
AND `object_collection`.`collection_id` IN (38,15,39,40,41)

Выглядит так
AND `object_collection`.`collection_id` IN ?
И при проверке синтаксиса в через PDO в методе select класса Illuminate\Database\Connection
$this->getPdoForSelect($useReadPdo)->prepare($query);

Мы получаем ошибку. В общем ни какой аномалии тут нет, а целиком мой затуп
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Распечатайте запрос с помощью метода toSql() и перепроверьте, экранирован ли у вас столбец code обратными кавычками. Это зарезервированное ключевое слово. Скорее всего проблема в этом.
Ошибка однозначно говорит о том, что в запросе используется зарезервированное ключевое слово.

Список новых ключевых слов в MySQL 5+
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы