我正在使用Yii框架,在构建Friend/Connection风格的系统时遇到了一个问题。我有一个标准的用户表,为了存储朋友,我有一张具有以下布局的朋友表(已经设置了适当的FK等):
id | userId | friendId | and some other fields...
由于"朋友"是相互的——因此,如果用户A与用户B是朋友,那么用户B与用户A是朋友——因此每个"友谊"只有一个条目。
我想做的是使用Yii的关系查询来最终返回属于朋友的项目。目前,我在用户模型中有以下关系。。。
'friends' => array(self::HAS_MANY, 'UserFriend', 'userId'),
但是,只有当用户ID出现在userId字段中时,它才会返回"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
希望我没有混淆太多!抱歉解释不周
感谢:)
按照此处的说明创建数据库命令对象,然后可以使用OR
条件进行查询,如下所示:
$command->where(array('OR', 'userID = :userID', 'userID = :friendID'), array(':userID' => $userID, ':friendID' => $friendID));
是否要获取应用程序当前用户的所有好友?您可以使用CDbWriter和方法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);
但我不确定你的User
和UserFriend
模型的结构和相互关系。你和UserFriend
和User
有什么关系吗?如果是这样的话,那么您可以在上面的代码之后使用类似$userFriends->user0
的东西。
CDb标准详细信息
find()方法详细信息