2011-04-27 78 views
2

我如何用所有關係返回對象(ans子對象關係?)。 現在我使用EJsonBehavior,但它僅返回第一級關係,而不是與子關聯的對象。 我的源代碼:Yii JSON與關係

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

回答

3

的預先加載的方式獲取相關的AR實例與主AR實例(S)在一起。這是通過將with()方法與AR中的find或findAll方法之一一起使用來實現的。例如,

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

上述代碼將返回Post實例的數組。與懶惰方法不同,在我們訪問屬性之前,每個Post實例中的作者屬性已經填充了相關的User實例。與其爲每個帖子執行連接查詢,渴望加載的方法將所有文章和他們的作者一起帶回到單個連接查詢中!

我們可以在with()方法中指定多個關係名稱,並且渴望加載方法將一次性完成。例如,下面的代碼將帶回的帖子連同其作者和類別:

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

我們還可以做嵌套的立即加載。相反關係的名單中,我們通過在關係名稱的分層表示對與()方法,如下所示,

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

上面的例子將帶回的所有帖子連同其作者和類別。它也會帶回每位作者的個人資料和帖子。

預先加載也可以通過與屬性指定CDbCriteria ::,像以下執行:

$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', 
    ) 
); 
+0

謝謝,我明天就試試! – 2011-04-27 17:59:49

3

我發現瞭解決方案。您可以使用$ row->屬性來創建數據

$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, 
     ));