すべてのリレーション(サブオブジェクトリレーション)を持つオブジェクトを返すにはどうすればよいですか?現在、EJsonBehaviorを使用していますが、サブ関連オブジェクトではなく、第1レベルの関係のみが返されます。私のソースコード:
$order = Order::model()->findByPk($_GET['id']);
echo $order->toJSON();
Yii::app()->end();
すべてのリレーション(サブオブジェクトリレーション)を持つオブジェクトを返すにはどうすればよいですか?現在、EJsonBehaviorを使用していますが、サブ関連オブジェクトではなく、第1レベルの関係のみが返されます。私のソースコード:
$order = Order::model()->findByPk($_GET['id']);
echo $order->toJSON();
Yii::app()->end();
熱心な読み込みアプローチは、関連する 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',
)
);
その解決策を見つけました。$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,
));