Kohana 3 ORM as_array返回ORM数组

时间:2010-10-31 05:07:55

标签: php orm kohana-3 kohana-orm

我正在执行一个简单的查询,并希望获得一个数组。 根据Kohana 3指南附带的ORM教程,我想我可以做到以下几点:

ORM::factory('user')->find_all()->as_array();

但这似乎给了我一个模型对象数组(即数组(User_Model1,User_Model2 ......

查看来源,我看到我可以通过黑客攻击以下补丁来轻松解决这个问题。

modules/database/classes/kohana/database/result.php
@@ -94,7 +94,7 @@
                        foreach ($this as $row)
                        {
-                               $results[] = $row;
+                               $results[] = $row->as_array();

这似乎更符合用户指南所说的内容:

  

ORM的一个强大功能是ORM :: as_array方法,它将给定记录作为数组返回。如果与ORM :: find_all一起使用,将返回所有记录的数组。有用的一个很好的例子是选择列表:

     

//显示用户名的选择字段(使用id作为值)echo      Form :: select('user',ORM :: factory('user') - > find_all() - > as_array('id','username'));

想知道这是否是故意的,如果是,为什么? 如果我想创建一个关联数组数组会有什么好处呢?

3 个答案:

答案 0 :(得分:4)

这是故意行为,因为(显然?)在文档中可见,所以请不要应用“补丁”。特别是因为您想要修改ORM(不仅仅是)本身。

请改为阅读:

  • 如果上应用了as_array(),则会返回行数组(每行都是单独的对象,而不是数组),
  • 如果应用于单行,则会将该行作为数组返回

所以你至少有两个解决方案:

  • 将集合转换为数组后显式转换每一行
  • 在代理类中添加自己的方法,而不是更改模块代码(Kohana有从类核心继承的空类,并且可以通过将它们放在应用程序/类中来覆盖)。

此特定类名为Kohana_Database_Result,因此请将Database_Result放在application/class/database/result.php中并使其继承自Kohana_Database_Result,然后更改所需内容(如果需要更改)这一点)。

答案 1 :(得分:0)

您正在使用ORM,但似乎您并不真正需要其功能(其中包括将数据库行作为Model对象返回)。在这种情况下,解决方案可能是直接使用Database类。从您的模型中,您可以:

$output = $this->_db->query(Database::SELECT, "select * from users");

默认情况下,Database::query()将返回一个关联数组。

答案 2 :(得分:-1)

ORM没有像你描述的方法。 Kohana 2.3.4中有select_list()方法,用户指南可能包含来自旧版(或未来版)的错误信息?

PS。并且没有理由更改DB Result对象,因为$row可能是任何(不仅是ORM)类。