2012-09-07 26 views
4

我使用Yii框架,并在构建Friend/Connection样式系统时遇到了问题。我有一个标准的用户表和存储的朋友我有以下布局的朋友表(适当FKS等已建立):使用关系AR检索“OR”条件

id | userId | friendId | and some other fields... 

由于“朋友”是相互的 - 所以,如果用户A是用户B的朋友,那么用户B是用户A的朋友 - 因此每个“友谊”只有一个条目。

我想要做的就是使用Yii的关系查询来最终返回属于朋友的物品。目前,我有在用户模式下的关系...

'friends' => array(self::HAS_MANY, 'UserFriend', 'userId'), 

但是,只有收益“朋友”如果用户的ID出现在userId字段。如果用户的ID位于friendId字段中,则“友谊”不会被识别。

有没有一种方法来查询使用“或” - 例如:如果用户的ID == userId或用户的ID == friendId然后返回该条目?

另外,有没有办法让Yii返回其他ID,所以如果用户ID == userId会返回friendId,否则如果用户ID == friendId则返回userId?

我最终试图做一些事情,如:

$userModel = User::model()->findByPk(Yii::app()->user->id); // user's model 
$userFriends = $userModel->with(items)->friends; // return friends with their items 

但愿我没有弄得太多了!对不起,我可怜的解释

谢谢:)

回答

0

按照创建数据库命令目标的指令here,然后你可以用一个OR条件如下查询:

$command->where(array('OR', 'userID = :userID', 'userID = :friendID'), array(':userID' => $userID, ':friendID' => $friendID)); 
+0

我看着那个选项,反正是有其整合为“关系”这样我就可以去'$用户> friends'然后执行DAO? –

+1

问题是关于ActiveRecord,你在回答与DAO无关的问题。 – cebe

0

你想获得您应用当前用户的所有朋友? 您可以使用CDbCriteria和方法find()。事情是这样的:

$criteria = new CDbCriteria; 
$criteria->addCondition('id = :userid'); 
$criteria->addCondition('friendid = :userid', 'OR'); // OR - the operator to join different conditions. Defaults to 'AND'. 
$criteria->params = array(':userid' => Yii::app()->user->id); 
$userFriends = UserFriend::model()->find($criteria); 

但我不知道在你的UserUserFriend模型结构和相互关系。你有一些从UserFriendUser的关系吗?如果是这样,你可以在上面的代码之后使用类似$userFriends->user0的东西。

CDbCriteria details

find() method details