Yii2对同一表的两个外键的条件联接


Yii2 conditional join on two foreign keys to same table

我在数据库中有两个表,即"user"answers"user_user",它们将用户链接到用户(多对多)

在user_user中有两列"user_id_0"answers"user_id_1"

我需要获取当前登录用户id等于user_id_0或user_id_1。

我可以简单地使用sql:来实现这一点

select * from user u
    inner join user_user uu 
    on uu. user_id_0 = u.id
       or uu.user_id_1 = u.id
    [where u.id = 1]

在Yii2中,我遇到了这样的问题:

($这将是用户类型)

$this->hasMany(User::className(), ['id' => 'user_id_0'])
        ->viaTable('user_user', ['user_id_0' => 'id'],
           function($query) {
              $query->orOnCondition(['user_id_1' => 'id']);
         });

现在这不能工作,因为hasMany()只链接到一个外键。如何执行类似上面SQL的操作?把两个外键和"或"连在一起。

我认为这是可能的,或者你会建议一个不同的数据库设计吗?这里的目标实际上是让用户能够像在社交网络中一样与其他用户建立"朋友"或"联系"。

我不确定这是否如您所期望的那样有效。我没有试过。

IMO查询应该是这样的(假设MySQL):

SET @id = 1; // or whatever
SELECT     user.*
FROM       user
INNER JOIN user_user
ON         user.id = user_user.id1 OR user.id = user_user.id2
WHERE      user.id != @id AND (user_user.id1 = @id OR user_user.id2 = @id)
GROUP BY   user.id;

这可以在课堂上实现用户如下:

public function getConnectedPersons() {
    return self::find()
        ->select('user.*')
        ->innerJoin('user_user', ['or',
                'user.id=user_user.user_id_0',
                'user.id=user_user.user_id_1'
            ]
        )->where(['and',
                ['user.id' => $this->id],
                ['or',
                    ['user_user.user_id_0' => $this->id],
                    ['user_user.user_id_1' => $this->id]
                ]
            ]
        )->groupBy('user.id');
}

这将返回一个ActiveQuery对象。如果要直接获取用户数组,请附加->all()

我希望这能奏效。它未经测试。但如果有什么问题,你可能会明白并给我反馈。

这可能不是最好的解决方案。它不使用viaTable(),它也应该以某种方式工作。