我正在尝试使用关系作为标准的一部分来创建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}}选项,但这似乎不起作用......
答案 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
,已加入Listing
和UserFavourite
。您必须设置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中进行了硬编码,而不是尝试使用关系,因为它似乎并不意味着以这种方式工作。