【问题标题】:SQL Statement issue with the Postgresql Support in CakePHP 2.4.7 and TreeBehaviorCakePHP 2.4.7 和 TreeBehavior 中的 Postgresql 支持的 SQL 语句问题
【发布时间】:2023-03-24 13:57:01
【问题描述】:

我运行一个 CakePHP 2.4.7 应用程序,使用 PostgreSQL 作为数据库。

似乎 CakePHP 或 PGSQL DBO source 在包含 Group ByOrder BY 时无法正确格式化 Postgre 的 SQL 查询。

我在尝试通过 TreeBehavior 保存充当树的“简单”模型时遇到此错误。 它来自 POST / create 操作。

数据库抛出错误

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 规范)拒绝这个请求(在我的例子中是由 cake 提出的):

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 在 MAX() SELECT 上添加“ORDER BY”或“ORDER BY”子句?

【问题讨论】:

    标签: php postgresql cakephp tree cakephp-2.4.7


    【解决方案1】:

    好吧,原因是我有一个属性 Emplacement::$order 定义为“引用 ASC”,然后 cakePHP 在每个 SQL 查询后添加 ORDER BY reference ASC,导致抛出上一个错误。

    我在 CakePHP github 帐户上发现了一个新问题:https://github.com/cakephp/cakephp/issues/5155

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多