Estoy creando una aplicación multiinquilino y me encuentro con un error después de agregar varias relaciones que apuntan a la misma tabla:
Uncaught Error: More than one relationship was found for teams and usersAl realizar esta consulta:
const data = await supabaseClient.from('organizations') .select(` *, teams( id, org_id, name, members:users( id, full_name, avatar_url ) ) `);Tengo las siguientes estructuras de tabla (dejando algunos campos por brevedad):
table users ( id uuid PK full_name text email text ) table organizations ( id uuid PK .... ) table organization_memberships ( id uuid PK organization_id uuid FK user_id uuid FK role ENUM ) table teams ( id uuid PK name text PK ) table team_memberships ( id uuid PK team_id uuid FK user_id uuid FK role ENUM ) table team_boards ( id uuid PK team_id uuid FK owner_id uuid FK )Debajo del capó, Supabase usa PostREST para consultas. Y he descifrado del mensaje de error que la consulta es ambigua y no está seguro de qué relación(es) cumplir. No estoy seguro de cómo decirle a Supabase qué relación usar en esta consulta en particular para evitar este error.
Aquí está el error de consola más detallado de postREST:
{ hint: "By following the 'details' key, disambiguate the request by changing the url to /origin?select=relationship(*) or /origin?select=target!relationship(*)", message: 'More than one relationship was found for teams and users', details: [ { origin: 'public.teams', relationship: 'public.team_memberships[team_memberships_team_id_fkey][team_memberships_user_id_fkey]', cardinality: 'm2m', target: 'public.users' }, { origin: 'public.teams', relationship: 'public.team_boards[team_boards_team_id_fkey][team_boards_owner_id_fkey]', cardinality: 'm2m', target: 'public.users' } ] }Profundizando un poco más en los documentos de PostgREST , resulta que lo que estaba buscando era el operador de desambiguación, ! .
La consulta de trabajo se ve así (tenga en cuenta que estamos desambiguando qué relación usar para satisfacer la consulta de los members ):
const data = await supabaseClient.from('organizations') .select(` *, teams( id, org_id, name, members:users!team_memberships( id, full_name, avatar_url ) ) `);