使用关系AR来检索“OR”条件

时间:2012-09-07 21:29:24

标签: php activerecord yii relational-database

我正在使用Yii框架,并在构建朋友/连接样式系统时遇到了一个问题。我有一个标准的用户表和存储朋友我有一个朋友表,其中包含以下布局(已经设置了相应的FK等):

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

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

我要做的是使用Yii的关系查询最终返回属于朋友的项目。目前我在用户模型中有以下关系...

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

但是,如果userId字段中存在用户ID,则仅返回“friends”。如果用户的ID在friendId字段中,则不会识别“友谊”。

有没有办法使用“OR”进行查询 - 例如:如果用户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

希望我没有太多困惑!对不起的解释很抱歉

谢谢:)

2 个答案:

答案 0 :(得分:0)

按照here的说明创建数据库命令对象,然后您可以使用OR条件进行查询,如下所示:

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

答案 1 :(得分: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