在supabase中的join中过滤

Fac*_*ano 5 javascript postgresql filtering node.js supabase

我使用 supabase 和一个有 2 个表的数据库(与此问题有关)。表是teachersusers。两者分别有IDid_teacher/ id_user。我正在处理一个查询,我需要让所有老师加入users表中,其中有一image列。我只需要获取not null 的teachers位置。user image

    const query = supabase.from(`teachers`).select(
      `
        *,
        id_user(
          image
        )
      `
    )
Run Code Online (Sandbox Code Playgroud)

此查询的作用是让教师加入用户表。因为我得到了我想要的回应。这是一个简短的例子。

{
    "id": 560,
    "teacher_experience": 9,
    "id_user":{
        "image": "example-image.jpg"
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试使用一些过滤器来避免null images时。

query.not('id_user.image', 'eq', null)
query.not('id_user.image', 'in', null)
query.ilike('id_user.image', 'null')
Run Code Online (Sandbox Code Playgroud)

user.image这只是我尝试避免具有空值的教师的过滤器的示例。因为,我不想得到整个项目,但我得到了一个带有id_user = null

{
    "id": 560,
    "teacher_experience": 9,
    "id_user": null          // In this case image is null but still giving me the user
}
Run Code Online (Sandbox Code Playgroud)

解决这个问题的正确形式是怎样的?

小智 18

现在这已经通过 PostgREST 9 实现了!

这是一个例子:

const { data, error } = await supabase
  .from('messages')
  .select('*, users!inner(*)')
  .eq('users.username', 'Jane'
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你必须这样做id_user!inner(image)

来源:https ://supabase.com/blog/postgrest-9#resource-embedding-with-inner-joins


小智 3

只需创建一个view数据库即可解决此问题。Aview是查询的快捷方式,并且可以应用where子句。

在 supabase 上的 sql 编辑器中https://app.supabase.io/project/{your_project_id}/editor/sql

使用连接创建一个新视图;

CREATE VIEW teachers_view AS
SELECT
    t.*,
    iu.image as image
FROM teachers as t
LEFT JOIN id_user as iu WHERE t.id = iu.teacher_id;
Run Code Online (Sandbox Code Playgroud)

在这里阅读有关左连接的更多信息

并在应用程序使用中

supabase.from('teachers_view').select().neq('image', null);
Run Code Online (Sandbox Code Playgroud)