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

标签 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 将是用户类型)

$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 的事情?用“或”连接两个外键。

这可能吗?或者您会建议不同的数据库设计吗?这里的目标实际上是让用户能够像在社交网络中一样与其他用户拥有“ friend ”或“联系”。

最佳答案

我不确定这是否如您所愿。我没有尝试过。

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

关于php - Yii2 条件连接两个外键到同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717531/

相关文章:

yii2 - 如何在 Yii2 框架中更快地加载 ActiveForm 页面

javascript - JQuery 更改输入字段

javascript - 当您返回浏览器时如何避免重新计算值(value)?

MYSQL一对多关系查询从 'many'表返回一行

mysql - 如何自动清除 MySQL Workbench 中的输出?

php - 如何从php中以forwordslash(/)结尾的字符串中删除第一个单词

php - 在 $_POST 中找不到输入类型=图像值

php - 如何在 PHP 中构建跨数据库查询?

mysql - mariadb sql 默认 unix_timestamp

twitter-bootstrap - Yii2 ListWidget自定义css的问题