Kohana 3 ORM as_array возвращает массив ORM - PullRequest
3 голосов
/ 31 октября 2010

Я выполняю простой запрос и хочу вернуть массив. Основываясь на руководстве ORM, которое идет вместе с руководством по Kohana 3, я подумал, что смогу сделать следующее:

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 ]

4 голосов
/ 23 апреля 2012

Это намеренное поведение, как (ясно?) Видно из документации, поэтому , пожалуйста, не применяйте этот "патч" .Особенно потому, что вы хотите изменить сам ORM (не только).

Вместо этого прочитайте это:

  • , если as_array() применяется к коллекции строк ,он возвращает массив строк (каждая строка является отдельным объектом, а не массивом),
  • , если применяется к одиночная строка , он возвращает строку как массив,

Таким образом, у вас есть как минимум два решения:

  • явное преобразование каждой строки после преобразования коллекции в массив,
  • добавление собственного метона в прокси-класс вместо изменения кода модуля (Kohanaимеет пустые классы, которые наследуются от базовых классов и которые вы можете переопределить, поместив их в приложение / классы).

Этот конкретный класс называется Kohana_Database_Result, поэтому поместите класс Database_Result в application/class/database/result.phpи сделайте так, чтобы он наследовал от Kohana_Database_Result, затем измените то, что вам нужно (если вам нужно это изменить).

0 голосов
/ 19 февраля 2012

Вы используете ORM, но, похоже, вам на самом деле не нужны его функции (например, для возврата строк базы данных в виде объектов модели). В этом случае решением может быть использование класса Database напрямую. Из вашей модели вы можете сделать:

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

По умолчанию Database::query() вернет ассоциативный массив.

0 голосов
/ 31 октября 2010

ORM не имеет методов, которые вы описываете. В Kohana 2.3.4 был метод select_list () , может быть, руководство пользователя содержит неверную информацию из старой (или будущей) версии?

PS. И нет никаких причин для изменения объекта Result DB, потому что $row может быть любым (не только ORM) классом.

...