idiorm / paris has_many as_array结果集

时间:2012-02-10 14:37:06

标签: php idiorm

我无法使用php idiorm / paris获取has_many查询的结果。根据{{​​3}}的示例,posts的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()这样的调用不起作用。

使用paris访问此类结果集的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

将此方法添加到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 :(得分:1)

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);