CakePHP解析查询结果的替代方案

时间:2011-05-18 15:16:23

标签: mysql cakephp

我有一个返回大量结果的查询,而我的代码内存不足,试图解析结果......如何在CakePHP中运行查询并获得正常结果?

解析它我的意思是....

SELECT table1.*, table2.* FROM table1 INNER JOIN table2 ON table1.id = table2.table1_id

通过上述查询,它将返回....

array(
   0 => array(
       'table1' => array(
            'field1' => value,
            'field2' => value
       ),
       'table2' => array(
            'field1' => value,
            'field2' => value
       )
   )
)

当它将这些结果解析为嵌套数组时,它的内存不足......我该如何避免这种情况?

我不能比现在更讨厌CakePHP: - \如果文档很合适,那将是一回事,但它并不合适,而且它的功能很烦人。

3 个答案:

答案 0 :(得分:0)

你可以这样做:

$list = $this->AnyModel->query("SELECT * FROM big_table");

但我不认为这会解决你的问题,因为如果你有例如10millon行...... php将无法管理10millon值的数组......

但您可能想要阅读这两个链接来更改execution timememory limit ..您也可以在php.ini上更改它们

祝你好运!

<强> EDITED 嗯,多亏了你的问题我已经学到了一些东西:P首先,我们都同意你收到那个错误,因为Cake执行查询并试图将结果存储在一个数组中,但php不支持一个大的数组所以它耗尽了内存和崩溃..我从来没有使用过经典的mysql_query()(我更喜欢PDO)但是在阅读文档后,似乎mysql_query将结果存储在resource内,因此,它没有加载内存上的结果,并允许您循环结果(如通过大文件循环)。所以现在我看到了差异......而你的问题实际上就是这个:

Can I stop CakePHP fetching all rows for a query?

=)我理解你对蛋糕的挫败感,有时我也会对它感到沮丧(你能否相信没有简单的方法来执行带有HAVING子句的查询?u_U)

干杯!

答案 1 :(得分:0)

我建议您在模型上使用Containable行为。这是控制返回的数据量的最简单方法。我确信这正是您需要实施的目标。

CakePHP :: Containable :: Core Behaviors

答案 2 :(得分:0)

您应该限制查询返回的行(如500行),并允许用户在需要时获取更多行(一次下一行500行)。你可以用分页组件和一点AJAX很好地做到这一点。