如何在Supabase中实现客户收藏餐厅的插入与查询功能
Supabase收藏餐厅查询失败问题
我已经在Supabase中创建了clients、restaurants和favorites三张表并通过外键关联,需要实现两个功能:点击收藏图标为客户添加收藏餐厅,以及查询客户的收藏餐厅(若存在)。
表结构
clients表
clients client_id uuid(pk), name text, email text, avatar text, points float4, favorite_id uuid(fk),
restaurants表
restaurants restaurant_id uuid(pk), name text, description text, logo text, location text, menu json,
favorites表
favorites favorite_id uuid(pk), created_at now(), client_id uuid(fk), restaurant_id uuid(fk),
现有代码情况
插入收藏餐厅的Dart代码可以正常运行:
final res = await supabase.client .from('favorites') .insert({ 'client_id': user.id, 'restaurant_id': res.id }) .execute(); /// 这段代码运行正常
但查询客户收藏餐厅的代码无法运行:
// 查询客户的收藏餐厅 final res = await supabase.client .from('restaurants') .select('*, favorites!inner(*)') .eq('client_id ', user.id); /// 完全无法运行
问题原因及解决方法
原查询代码的核心问题是:restaurants表中不存在client_id字段,你错误地在该表上使用了eq('client_id', user.id)过滤条件。正确的做法是通过关联的favorites表指定客户ID的过滤规则,以下是两种可行的查询写法:
写法1:从收藏表出发关联餐厅信息
直接查询favorites表,同时获取关联的餐厅详情:
final res = await supabase.client .from('favorites') .select('*, restaurants(*)') .eq('client_id', user.id);
写法2:从餐厅表出发通过收藏表过滤
如果需要以餐厅表为查询主体,需将过滤条件指向关联的favorites表中的client_id字段:
final res = await supabase.client .from('restaurants') .select('*, favorites(*)') .eq('favorites.client_id', user.id);
另外,若希望客户没有收藏餐厅时返回空结果而非报错,可以去掉!inner内连接标记,使用默认的左连接即可。
内容的提问来源于stack exchange,提问作者ASA Serge
相关产品推荐
相关产品推荐

