Yii - 使用关系的CActiveDataProvider

时间:2014-08-20 22:13:28

标签: php activerecord yii

我正在尝试使用关系作为标准的一部分来创建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

我尝试使用with的{​​{1}}选项,但这似乎不起作用......

3 个答案:

答案 0 :(得分:8)

您尚未提供数据库架构,但我想这段代码可以正常运行,

$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 ,在这种情况下,您可能需要更改您的查询。让我知道这对您有用。

答案 1 :(得分:2)

Listing relations方法中,您需要与之建立关系 Users通过中间表UsersFavourite。关系类型 是HAS_MANY:

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

在返回User的{​​{1}}方法中:主模型 是CActiveDataProvider,已加入ListingUserFavourite。您必须设置User  到together构建一个单独的SQL查询。最后,您必须将users.id设置为 true模型的当前id仅带来与当前用户相关的行。

User

我测试了这个答案并且使用了一个小数据集。

答案 2 :(得分:1)

以下是我获得所需输出的方法:

$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中进行了硬编码,而不是尝试使用关系,因为它似乎并不意味着以这种方式工作。