Проблема оператора SQL с поддержкой Postgresql в CakePHP 2.4.7 и TreeBehavior

0

Я запускаю приложение CakePHP 2.4.7, используя PostgreSQL в качестве базы данных.

Кажется, что CakePHP или PGSQL DBO source неправильно форматируют SQL-запросы для Postgre, когда они содержат Group By или Order BY.

Я получил эту ошибку, пытаясь сохранить "простую" модель, действующую как Tree через TreeBehavior. Это из POST/create action.

Ошибка сброса базы данных

Error: SQLSTATE[42803]: Grouping error: 7 ERROR: column "Emplacement.reference" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ...RE 1 = 1 AND "Emplacement"."id" <> 126 ORDER BY "reference... ^

SQL-запрос:

SELECT MAX("Emplacement"."rght") AS "rght" 
FROM "mpdefault"."emplacements" AS "Emplacement" 
WHERE 1 = 1 AND "Emplacement"."id" <> 126 ORDER BY "reference" ASC LIMIT 1

Трассировки стека:

CORE/Cake/Model/Datasource/DboSource.php line 458 → PDOStatement->execute(array)
CORE/Cake/Model/Datasource/DboSource.php line 424 → DboSource->_execute(string, array)
CORE/Cake/Model/Datasource/DboSource.php line 665 → DboSource->execute(string, array, array)
CORE/Cake/Model/Datasource/DboSource.php line 1077 → DboSource->fetchAll(string, boolean)
CORE/Cake/Model/Model.php line 2903 → DboSource->read(Emplacement, array)
CORE/Cake/Model/Model.php line 2875 → Model->_readDataSource(string, array)
CORE/Cake/Model/Behavior/TreeBehavior.php line 1013 → Model->find(string, array)
CORE/Cake/Model/Behavior/TreeBehavior.php line 932 → TreeBehavior->_getMax(Emplacement, string, string, integer, boolean)
CORE/Cake/Model/Behavior/TreeBehavior.php line 96 → TreeBehavior->_setParent(Emplacement, string, boolean)
[internal function] → TreeBehavior->afterSave(Emplacement, boolean, array)
CORE/Cake/Utility/ObjectCollection.php line 132 → call_user_func_array(array, array)
[internal function] → ObjectCollection->trigger(CakeEvent)
CORE/Cake/Event/CakeEventManager.php line 247 → call_user_func(array, CakeEvent)
CORE/Cake/Model/Model.php line 1861 → CakeEventManager->dispatch(CakeEvent)
APP/Controller/EmplacementsController.php line 87 → Model->save(array)
[internal function] → EmplacementsController->admin_add()
CORE/Cake/Controller/Controller.php line 490 → ReflectionMethod->invokeArgs(EmplacementsController, array)
CORE/Cake/Routing/Dispatcher.php line 185 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 160 → Dispatcher->_invoke(EmplacementsController, CakeRequest, CakeResponse)
APP/webroot/index.php line 108 → Dispatcher->dispatch(CakeRequest, CakeResponse)

Поскольку запрос написан в основной структуре, которую я не знаю, я прошу вашу помощь понять и решить эту проблему.

Считаете ли вы, что обновление моей версии до cakephp-2.6 может помочь?

Postgre SQL (обычные спецификации SQL) отклоняет этот запрос (сделанный торт в моем случае):

SELECT MAX("Emplacement"."rght") AS "rght"
FROM "mpdefault"."emplacements" AS "Emplacement" 
WHERE 1 = 1 AND "Emplacement"."id" = 126 
ORDER BY "reference" ASC LIMIT 1 

но похоже, что mySQL - это хорошо.

Принимаемые запросы PostgreSQL могут быть:

SELECT MAX("Emplacement"."rght") AS "rght"
FROM "mpdefault"."emplacements" AS "Emplacement" 
WHERE 1 = 1 AND "Emplacement"."id" = 126 

или

SELECT MAX("Emplacement"."rght") AS "rght"
FROM "mpdefault"."emplacements" AS "Emplacement" 
WHERE 1 = 1 AND "Emplacement"."id" = 126 
group by "reference"
ORDER BY "reference" ASC LIMIT 1 

Но эти запросы не имеют смысла.

Почему CakePHP добавляет предложение ORDER BY или ORDER BY на MAX() SELECT?

Теги:
cakephp
tree
cakephp-2.4.7

1 ответ

0
Лучший ответ

Хорошо, причина в том, что у меня есть свойство Emplacement :: $ order, определенное как "ссылка ASC", а затем cakePHP добавляет ORDER BY reference ASC после каждого SQL-запроса, вызывая выброс предыдущей ошибки.

Я рассмотрел новую проблему с учетной записью CatchPHP github для этой проблемы: https://github.com/cakephp/cakephp/issues/5155

Ещё вопросы

Сообщество Overcoder
Наверх
Меню