如何让Supabase查询返回字符串而非列表(多语言场景)
问题
我希望将Supabase查询返回结果中的interest.name、interest.description、interest.category.name字段从当前的列表类型转换为字符串类型。这些字段属于多语言翻译内容,我已通过.eq('...',languageCode)语句筛选对应语言的翻译内容,请问是否可以在Supabase中实现该需求?
当前返回的JSON数据
{ "id":"f36686d7-f815-4372-aba8-4d3f7fe1a4a5", "member_id":"c2579821-54e4-42c8-8b35-b522a34712a2", "interest_id":"yoga", "interest":{ "id":"yoga", "name":[ { "name":"Yoga" } ], "active":true, "category":{ "id":"fitness", "icon":"meditation", "name":[ { "name":"Fitness" } ], "color":"primary200", "active":true }, "category_id":"fitness", "description":[ { "description":"Physical activity focused on poses and meditation." }, { "description":"Actividad física basada en posturas y meditación." } ], "interest_type_id":"fitness" } }
当前查询代码(Dart)
var query = _supabaseClient.from('member_interests').select(''' *, interest:interest_id( *, category:category_id( *, name: category_translations(name) ), name: interest_translations(name), description: interest_translations(description) ) ''').eq('member_id', memberId); if (languageCode != null) { query = query.eq( 'interest.interest_translations.language_code', languageCode, ); query = query.eq( 'interest.category.category_translations.language_code', languageCode, ); } final data = await query; return data.map(MemberInterest.fromJson).toList();
解决方案
完全可以实现,借助PostgreSQL的JSON函数和Supabase的查询转换能力即可——既然你已经通过languageCode筛选出对应语言的单条翻译,直接提取数组中唯一元素的字段值转成字符串就行。
修改后的查询语句
调整select中的字段定义,使用->>系列操作符提取数组第一个元素的对应字段值:
var query = _supabaseClient.from('member_interests').select(''' *, interest:interest_id( *, category:category_id( *, name: category_translations(name)->0->>'name' ), name: interest_translations(name)->0->>'name', description: interest_translations(description)->0->>'description' ) ''').eq('member_id', memberId); if (languageCode != null) { query = query.eq( 'interest.interest_translations.language_code', languageCode, ); query = query.eq( 'interest.category.category_translations.language_code', languageCode, ); } final data = await query; return data.map(MemberInterest.fromJson).toList();
关键逻辑说明
->0:取数组的第一个元素(因为你已经通过语言筛选,数组只会有一条符合条件的翻译数据)->>'name':提取该JSON对象中name字段的字符串值- 修改后,返回的
interest.name、interest.description、interest.category.name会直接是字符串类型,不再是数组
容错备选方案
如果担心极端情况(比如无匹配翻译导致数组为空),可以用coalesce设置默认值避免报错:
name: coalesce(interest_translations(name)->0->>'name', '')
内容的提问来源于stack exchange,提问作者Joaquín Varela
相关产品推荐
相关产品推荐

