2012-02-10 28 views
2

php idiorm/parisを使用してhas_manyクエリの結果を取得できません。 paris siteの例に続いて、投稿のhas_many結果がオブジェクトとして返されます。idiorm/paris has_many as_array結果セット

オブジェクトを実行して個々のメソッドにアクセスすることはできますが、結果セットを連想配列としてテンプレートエンジンに渡して表示することができます。

例:

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()を使用して、結果セット全体を連想配列として取得し、cによって制限されていますas_arrayが個々の行に対して機能する方法でフィールドを消去します。

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

この、あるいはする$ user-ような何かの呼び出し>ポスト() - > find_many() - > as_array()は動作しません。

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

答えて

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

これはあなたのものです'ORM'を直接拡張するのではなく、' ORM'を拡張するクラスで実際に行うべきです。そうしないと、簡単にアップグレードすることはできません。 Idiormのプルリクエストとしてこれを開くことについて考えましたか? – Treffynnon

+1

この機能はIdiom/Parisに追加されました。 [Docs](http://idiorm.readthedocs.org/en/latest/querying.html?highlight=find_array#as-an-associative-array) – alttag

1

find_oneはModelオブジェクトを返し、find_manyはModelsの配列を返します。 あなたが連想配列の配列として結果セット全体を取得したい場合は、一つの解決策は5.3+

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でのarray_mapを使用するようにする必要があります(テストしていません)

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