我在数据库中有两个表,即“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/