我在数据库中有两个表,即" 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?使用'或' /
加入两个外键我有可能或者您会建议不同的数据库设计吗?这里的目标是让用户拥有"朋友"或"连接"与社交网络中的其他用户一样。
答案 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(),它也应该以某种方式工作。