簡體   English   中英

Yii - 使用關系的CActiveDataProvider

[英]Yii - CActiveDataProvider using relations

我試圖使用關系作為標准的一部分來創建CActiveDataProvider 我有以下內容:

用戶模型:

return array(
        'favourites'=>array(self::HAS_MANY, 'UserFavourite', 'user_id', 'order'=>'added_at DESC'),
);

UserFavourite模型:

return array(
        'user'=>array(self::BELONGS_TO, 'User', 'user_id'),
        'listing'=>array(self::BELONGS_TO, 'Listing', 'listing_id'),
);

控制器(查看收藏夾操作):

$user = $this->loadUser(Yii::app()->user->id);

如何在我的用戶模型中創建CActiveDataProvider ,以獲取當前用戶的所有favourites - 以及每個收藏夾的相關listing模型數據? 所以我想做一些像$favourites = $user->getFavourites();

CActiveDataProvider應該返回一個Listing對象數組。 它應該支持分頁和排序 - 默認排序將是added_at DESC

我嘗試過使用CDbCriteriawith選項,但這似乎不起作用......

您還沒有提供數據庫架構,但我想這段代碼可以工作,

$criteria=new CDbCriteria();
$criteria->with=array('favourites'=>array('with'=>'listing'));
$dataProvider= new CActiveDataProvider('User', array(
        'criteria'=>$criteria,
        'sort'=>array(
            'defaultOrder'=>'t.added_at DESC',
        )));

請確保您的關系正確且符合架構。

  • 事實上,如果你不關心查詢的數量,你可以隨時調用類似的東西

    $用戶>收藏夾;

它將返回正確關系的正確數據,您可以再次執行此操作

為了 ,通過列表模型查看就像這樣

foreach($user->favourites as $fav){

  $this->renderPartial("PATH TO YOUR VIEW",array('data'=>$fav->listing));

}

請注意,用戶可能有許多收藏夾,因此您需要使用foreach,除非您不使用CListview 另一種方法是用戶Clistview,在這種情況下,您可能需要更改您的查詢。讓我知道這對您有用。

在您的Listing relations方法中,您需要通過中間表UsersFavouriteUsers建立關系。 關系類型是HAS_MANY:

return array(
         'favourites'=>array(self::HAS_MANY, 'UserFavourite', 'listing_id'),
         'users'=>array(self::HAS_MANY, 'User', array('user_id'=>'id'), 'through'=>'favourites')
);

在返回CActiveDataProviderUser方法中:主模型是Listing ,加入UserFavouriteUser 您必須設置together ,以true建立一個單一的SQL查詢。 最后,您必須將users.id設置為User model的當前ID,以僅顯示與當前用戶相關的行。

$criteria = new CDbCriteria;
$criteria->with = array( 'favourites','users =>'array('condition'=>"users.id=:user_id"));
$criteria->together = true;
$criteria->params = array(':user_id'=>$this->id);

return new CActiveDataProvider('Listing', array(
        'criteria'=>$criteria,
        'sort'=>array('defaultOrder'=>'favourites.added_at DESC')
));

我測試了這個答案,並使用一個小數據集正確工作。

這是我如何達到所需的輸出:

$criteria = new CDbCriteria;
$criteria->condition = 'uf.user_id = :user_id';
$criteria->params = array(':user_id'=>$this->id);
$criteria->join = 'LEFT OUTER JOIN user_favourite uf ON uf.listing_id = t.id';
$criteria->order = 'uf.added_at DESC';

return new CActiveDataProvider('Listing', array(
    'criteria'=>$criteria,
));

最后我在JOIN中進行了硬編碼,而不是嘗試使用關系,因為它似乎並不意味着以這種方式工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM