2

PHP idiorm/paris を使用して has_many クエリの結果を取得できません。パリのサイトの例に従って、投稿の 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() のような呼び出しは機能しません。

パリを使用してこのタイプの結果セットにアクセスする正しい方法は何ですか?

4

2 に答える 2

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

于 2012-02-12T01:25:19.270 に答える
1

find_one はモデル オブジェクトを返し、find_many はモデルの配列を返します。結果セット全体を連想配列の配列として取得する場合、1 つの解決策は 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);
于 2012-03-26T14:45:27.767 に答える