为什么CakePHP将数据库结果包装成如此多的子数组?

为什么CakePHP将数据库结果包装成如此多的子数组?,cakephp,Cakephp,CakePHP有一个恼人的习惯,在从数据库中提取数据时,它具有非常深的多维数组 例如,我只想使用SQL\u CALC\u FOUND\u rows和“选择FOUND\u rows()作为row\u count”获取上一个查询返回的行数。结果有三个数组深度:$result[0][0]['row\u count'].这是一个非常好的问题!我不知道为什么CakePHP会这样做,我自己也在想同样的事情。我只对蛋糕的“内部”进行了半深入的研究,还没有深入到框架的这一方面 如果我大胆猜测… 这是蛋糕ORM的

CakePHP有一个恼人的习惯,在从数据库中提取数据时,它具有非常深的多维数组


例如,我只想使用SQL\u CALC\u FOUND\u rows和“选择FOUND\u rows()作为row\u count”获取上一个查询返回的行数。结果有三个数组深度:$result[0][0]['row\u count'].

这是一个非常好的问题!我不知道为什么CakePHP会这样做,我自己也在想同样的事情。我只对蛋糕的“内部”进行了半深入的研究,还没有深入到框架的这一方面

如果我大胆猜测…

这是蛋糕ORM的副作用。至少在我看来,Cake附带的ORM非常好,它允许您使用几乎很少或根本没有原始SQL来进行一些高度复杂的查询。我相信这是蛋糕受欢迎的部分原因。在创建查询和返回数据时,它将复杂的SQL语句转换为相对简单的多维数组结构

蛋糕的另一个可能影响这一点的方面是他们的“约定优于配置”哲学。我相信,在开发方面,返回相同的通用数组结构比尝试优化原始SQL更简单。我敢打赌,大多数蛋糕查询都是通过ORM生成的,而不是由开发人员编写的原始查询。从开发的角度来看,为它们优化可能没有意义


再说一次,这只是我的猜测。

这是一个很好的问题!我不知道为什么CakePHP会这样做,我自己也在想同样的事情。我只对蛋糕的“内部”进行了半深入的研究,还没有深入到框架的这一方面

如果我大胆猜测…

这是蛋糕ORM的副作用。至少在我看来,Cake附带的ORM非常好,它允许您使用几乎很少或根本没有原始SQL来进行一些高度复杂的查询。我相信这是蛋糕受欢迎的部分原因。在创建查询和返回数据时,它将复杂的SQL语句转换为相对简单的多维数组结构

蛋糕的另一个可能影响这一点的方面是他们的“约定优于配置”哲学。我相信,在开发方面,返回相同的通用数组结构比尝试优化原始SQL更简单。我敢打赌,大多数蛋糕查询都是通过ORM生成的,而不是由开发人员编写的原始查询。从开发的角度来看,为它们优化可能没有意义


同样,这只是我的猜测。

首先,您使用的是自定义查询,cake必须处理返回数据的所有可能情况(它不知道返回数据将是1个值)。以$result数组为例,我想最外层的数组是用于返回多条记录的数据


是的,它是这样的,因为它遵循一定的步骤将DB结果转换为PHP变量。而且在整个框架中保持一致性更好。在像您这样的情况下,这当然很烦人,但您始终可以在app_模型中定义一个自定义query()函数,以便在只有一个返回值的情况下智能地去除数组。

首先,您使用的是自定义查询,cake必须处理所有可能返回数据的情况(它不知道返回的数据将是1个值)。例如$result数组,我猜最外层的数组是用于返回的数据是多个记录的情况

是的,它是这样的,因为它遵循一定的步骤将DB结果转换为PHP变量。而且它更好地保持整个框架的一致性。在像您这样的情况下,这当然很烦人,但您可以始终定义一个自定义查询()如果只有一个返回值,则在app_model中可以智能地去除阵列。

您可以使用
$this->Model->find('count');
? 或者将查询重写为
“选择find_ROWS()作为TableName.row\u count from TableName TableName”

您可以使用
$this->Model->find('count');
? 或者将查询重写为
“选择find_ROWS()作为TableName.row_count from TableName TableName”

它实际上不是一个表名,而是一个模型名:
$this->ModelName->find('count');
你是对的,对不起,应该是
“选择find_ROWS()作为Model.row_count from TableName Model”
它实际上不是表名,而是模型名:
$this->ModelName->find('count');
您是对的,对不起,应该是
“选择find_ROWS()作为Model.row_count from tablename Model”