【问题标题】:Using relational AR to retrieve "OR" condition使用关系 AR 检索“OR”条件
【发布时间】:2012-09-01 18:47:08
【问题描述】:

我正在使用 Yii 框架,在构建朋友/连接风格系统时遇到了问题。我有一个标准的用户表并存储朋友我有一个具有以下布局的朋友表(已设置适当的 FK 等):

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

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

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

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

但是,如果用户 ID 存在于 userId 字段中,则仅返回“朋友”。如果用户 ID 在friendId 字段中,则无法识别“友谊”。

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

希望我没有混淆太多!抱歉解释不好

谢谢:)

【问题讨论】:

    标签: php activerecord yii relational-database


    【解决方案1】:

    您想获取您应用当前用户的所有朋友吗? 您可以使用 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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我看过那个选项,有没有办法把它整合为一个“关系”,这样我就可以去$user->friends,然后它执行DAO?
      • 这个问题是关于 ActiveRecord 的,你在 DAO 中回答是不相关的。
      猜你喜欢
      • 2021-02-17
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多