3

すべてのリレーション(サブオブジェクトリレーション)を持つオブジェクトを返すにはどうすればよいですか?現在、EJsonBehaviorを使用していますが、サブ関連オブジェクトではなく、第1レベルの関係のみが返されます。私のソースコード:

    $order = Order::model()->findByPk($_GET['id']);
    echo $order->toJSON();
    Yii::app()->end();
4

3 に答える 3

3

熱心な読み込みアプローチは、関連する AR インスタンスをメインの AR インスタンスと共に取得します。これは、AR の find または findAll メソッドのいずれかと一緒に with() メソッドを使用することによって実現されます。例えば、

$posts=Post::model()->with('author')->findAll();

上記のコードは、Post インスタンスの配列を返します。怠惰なアプローチとは異なり、各 Post インスタンスの author プロパティには、プロパティにアクセスする前に、関連する User インスタンスが既に設定されています。投稿ごとに結合クエリを実行する代わりに、熱心な読み込みアプローチにより、すべての投稿とその作成者が 1 つの結合クエリで返されます。

with() メソッドで複数のリレーションシップ名を指定でき、イーガー ロード アプローチにより、それらすべてが一度に返されます。たとえば、次のコードは、投稿を作成者とカテゴリとともに表示します。

$posts=Post::model()->with('author','categories')->findAll();

ネストされた熱心な読み込みを行うこともできます。リレーションシップ名のリストの代わりに、次のようにリレーションシップ名の階層表現を with() メソッドに渡します。

$posts=Post::model()->with(
    'author.profile',
    'author.posts',
    'categories')->findAll();

上記の例では、すべての投稿が作成者とカテゴリとともに返されます。また、各著者のプロフィールと投稿も表示されます。

次のように CDbCriteria::with プロパティを指定することで、一括読み込みを実行することもできます。

$criteria=new CDbCriteria;
$criteria->with=array(
    'author.profile',
    'author.posts',
    'categories',
);
$posts=Post::model()->findAll($criteria);

また

$posts=Post::model()->findAll(array(
    'with'=>array(
        'author.profile',
        'author.posts',
        'categories',
    )
);
于 2011-04-27T17:40:17.110 に答える
3

その解決策を見つけました。$row->attributes を使用してデータを作成できます

    $magazines = Magazines::model()->with('articles')->findAll();


    $arr = array();
    $i = 0;
    foreach($magazines as $mag)
    {   
        $arr[$i] = $mag->attributes;
        $arr[$i]['articles']=array();
        $j=0;
        foreach($mag->articles as $article){
            $arr[$i]['articles'][$j]=$article->attributes;
            $j++;
        }
        $i++;
    }
    print CJSON::encode(array(
            'code' => 1001,
            'magazines' => $arr,
        ));
于 2011-12-09T09:20:00.250 に答える