4

我正在执行一个简单的查询,并想取回一个数组。根据 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' ));

想知道这是不是故意的,如果是,为什么?如果我确实想创建一个关联数组的数组,有什么更好的解决方法?

4

3 回答 3

5

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

而是阅读以下内容:

  • 如果as_array()应用于rows 的集合,则返回行数组(每行是单独的对象,而不是数组),
  • 如果应用于单行,则将行作为数组返回,

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

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

这个特定的类称为Kohana_Database_Result,因此将类Database_Result放入application/class/database/result.php并使其继承自Kohana_Database_Result,然后更改您需要的内容(如果需要更改)。

于 2012-04-23T07:44:50.827 回答
0

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

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

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

于 2012-02-19T05:43:57.457 回答
-1

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

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

于 2010-10-31T20:24:30.810 回答