idiorm / paris has_many набор результатов as_array - PullRequest
2 голосов
/ 10 февраля 2012

У меня проблемы с получением результатов запроса has_many с использованием php idiorm / paris. Следуя примеру с парижского сайта , результат has_many для сообщений возвращается как объект.

Это замечательно, и я могу бегать по объектам и получать доступ к отдельным методам, но я хочу передать набор результатов в виде ассоциативного массива моему механизму шаблонов для отображения.

Пример:

   class Post extends Model {
   }

   class User extends Model {
       public function posts() {
           return $this->has_many('Post'); // Note we use the model name literally - not a    pluralised version
       }
   }

API работает следующим образом:

   // Select a particular user from the database
   $user = Model::factory('User')->find_one($user_id);

   // Find the posts associated with the user
   $posts = $user->posts()->find_many();

Я могу получить доступ к объекту posts и напечатать результирующий набор следующим образом:

   // echo each post id
   foreach ($posts as $post) {
      echo $post->id;
   }

Что я действительно хотел бы сделать, так это использовать as_array () для получения всего набора результатов в виде ассоциативного массива, ограниченного определенными полями в том, как as_array работает для отдельной строки, например

   $post_list = $posts()->as_array(id,title,post,date);

Это, или вызов чего-то вроде $ user-> posts () -> find_many () -> as_array () не работает.

Как правильно получить доступ к этому типу результатов с помощью Парижа?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Добавление этого метода в idiorm.php дает мне желаемую функциональность.

public function find_array() {
    if (func_num_args() === 0) {
        return $this->_run();
    }
    $args = func_get_args();
    $array = array();
    foreach ($this->_run() as $r) {
        $array[] = array_intersect_key($r, array_flip($args));
    }
    return $array;
}

Теперь я могу вызвать $ post_list = $ posts () -> find_array (); или $ posts () -> find_array ('id', 'title'); и т.д.

1 голос
/ 26 марта 2012

find_one возвращает объект Model, find_many возвращает массив Models. Если вы хотите получить весь набор результатов в виде массива ассоциативного массива, одним из решений должно быть использование array_map

function model_as_array($model) {
    return $model->as_array();
}

$posts = $user->posts()->find_many();
$my_view->posts = array_map(model_as_array, $posts);
var_dump($my_view->posts);

или в php 5.3+ (не тестировалось)

$aa_posts = array_map(function($model) {return $model->as_array();} , $posts);
...