Yii2条件连接两个外键到同一个表

时间:2015-02-25 11:12:59

标签: php sql yii2

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

在user_user中有两列" user_id_0"和" 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将是User类型)

$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?使用'或' /

加入两个外键

我有可能或者您会建议不同的数据库设计吗?这里的目标是让用户拥有"朋友"或"连接"与社交网络中的其他用户一样。

1 个答案:

答案 0 :(得分:2)

我不确定这是否按预期工作。我没试过。

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;

这可以在类User中实现:

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(),它也应该以某种方式工作。