Supabase JS中关联双表时使用.or方法查询好友关系的问题
解决方法
原生SQL实现
你需要将user表分别以别名关联到friends表的sent和received字段,以此同时获取双方的用户信息:
SELECT f.*, sender.*, receiver.* FROM friends f INNER JOIN user sender ON f.sent = sender.id INNER JOIN user receiver ON f.received = receiver.id WHERE f.accepted = TRUE AND (f.sent = :current_user_id OR f.received = :current_user_id);
替换:current_user_id为当前用户的实际ID即可执行查询。
SQLAlchemy ORM实现
如果使用SQLAlchemy,需要给User模型创建两个别名,分别对应发送方和接收方,避免关联冲突:
from sqlalchemy.orm import aliased # 定义User模型的两个别名,区分发送方和接收方 Sender = aliased(User) Receiver = aliased(User) current_user_id = 你的当前用户ID # 构建查询语句 friend_records = db.session.query(Friends, Sender, Receiver)\ .join(Sender, Friends.sent == Sender.id)\ .join(Receiver, Friends.received == Receiver.id)\ .filter(Friends.accepted == True)\ .filter((Friends.sent == current_user_id) | (Friends.received == current_user_id))\ .all() # 遍历结果示例 for friend, sender, receiver in friend_records: # 访问发送方信息:sender.name、sender.email等 # 访问接收方信息:receiver.name、receiver.email等 # 访问好友关系信息:friend.accepted等 pass
报错原因说明
之前直接用recieved(*)、sent(*)关联查询报错,是因为这两个字段都关联到user表,但没有明确区分是两个不同的关联实例,ORM无法识别对应的关联对象。通过给user表(或模型)设置别名,就能明确区分发送方和接收方的关联关系,解决冲突问题。
内容的提问来源于stack exchange,提问作者Deep Shetye
相关产品推荐
相关产品推荐

