Supabase多关联表OR查询:筛选含营业商铺/餐厅的商场
Supabase关联表多条件.or()查询解决方案
问题
现有三张关联表:malls、stores、restaurants,其中stores和restaurants通过mallId外键关联malls。需求是查询所有至少有1家营业(isOpen为true)的商铺或餐厅的商场,预期结果为Josh's Mall(因该商场内的PF Changs餐厅处于营业状态)。
在使用Supabase客户端代码查询时,遇到.or()条件无法同时指定两个关联表的问题:
- 尝试代码1:
.from("malls") .select("name, store!inner( isOpen ), restaurants!inner( isOpen )") .or("store.isOpen.eq.true, restaurants.isOpen.eq.true")
- 尝试指定单个关联表的代码:
.from("malls") .select("name, stores!inner( isOpen ), restaurants!inner( isOpen )") .or('isOpen.eq.true', { foreignTable: "stores" })
以上写法均无法同时添加restaurants表的条件,期望实现类似如下伪代码的逻辑:
.from("malls") .select("name, stores!inner( isOpen ), restaurants!inner( isOpen )") .or( .filter("stores.isOpen", "eq", true) .filter("restaurants.isOpen", "eq", true) )
正确查询写法
方式1:字符串格式条件
直接在.or()中使用完整的关联表字段路径,结合!inner过滤无符合条件关联数据的商场:
const { data, error } = await supabase .from('malls') .select('name, stores!inner(isOpen), restaurants!inner(isOpen)') .or('stores.isOpen.eq.true, restaurants.isOpen.eq.true')
方式2:对象格式条件(可读性更强)
通过数组传入多个条件对象,每个对象指定对应关联表和判断条件:
const { data, error } = await supabase .from('malls') .select('name, stores!inner(isOpen), restaurants!inner(isOpen)') .or([ { 'isOpen': { 'eq': true }, foreignTable: 'stores' }, { 'isOpen': { 'eq': true }, foreignTable: 'restaurants' } ])
关键说明
!inner连接符会自动排除没有对应营业商铺/餐厅的商场,确保结果仅包含满足需求的记录。- 对象格式的
.or()支持同时指定不同关联表的条件,每个条件通过foreignTable字段绑定对应的关联表,完美实现“商铺营业 或 餐厅营业”的逻辑。
内容的提问来源于stack exchange,提问作者Kishan Sripada
相关产品推荐
相关产品推荐

