【问题标题】:idiorm / paris has_many as_array result setidiorm / paris has_many as_array 结果集
【发布时间】:2012-02-10 14:37:05
【问题描述】:

我无法使用 php idiorm/paris 获取 has_many 查询的结果。按照paris site 中的示例,帖子的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();

我可以像这样访问帖子对象并打印结果集:

   // 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 访问此类结果集的正确方法是什么?

【问题讨论】:

    标签: php idiorm


    【解决方案1】:

    将此方法添加到 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');等等

    【讨论】:

    • 这是您真正应该在扩展ORM 的类中而不是直接在ORM 中执行的操作,否则您将无法轻松升级。您是否考虑过将其作为 Idiorm 的拉取请求打开?
    • 此功能已添加到 Idiom/Paris。 Docs
    【解决方案2】:

    find_one 返回一个模型对象,find_many 返回一个模型数组。 如果要将整个结果集作为关联数组的数组,一种解决方案应该是使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多