首頁  >  問答  >  主體

Supabase - 等價於無限價值

<p>對於授權流程,在中間件中,我想要在<code>.eq</code>語句中匹配任何值。一般用戶只能看到自己建立的貼文。管理員可以看到所有帖子。 </p> <pre class="brush:js;toolbar:false;">const userMatcher = user.role === "admin" ? "*" : user.id; const { data: post } = await supabase .from("posts") .select("*") .eq("id", id) .eq("userId", userMatcher) .single(); </pre> <p>在這裡匹配"*"是不起作用的。如果可能的話,我希望保持這段程式碼的整潔,而不是為管理員情況重複查詢(減去用戶匹配器)。 </p> <p>如果有可能,最乾淨的方法是什麼? </p>
P粉741223880P粉741223880432 天前468

全部回覆(2)我來回復

  • P粉513316221

    P粉5133162212023-08-16 16:57:09

    Michael Coxon的回答是完美的。

    或者,您可以透過多個邏輯運算子的組合來實現類似的結果。

    嘗試這樣做:

    #
    const userMatcher = user.role === "admin" ? true : { userId: user.id };
    
    const { data: post } = await supabase
      .from("posts")
      .select("*")
      .or(`userId.eq.${userMatcher}`, "id.eq." + id)
      .single();

    對於管理員使用者:user.role === "admin",因此條件userId.eq.true始終評估為true,允許管理員使用者查看所有貼文。

    對於其他使用者:條件userId.eq.{userId: user.id}限制了選擇只有userId與目前使用者的ID相符的貼文。

    id.eq.${id}確保檢索到指定id的貼文。

    回覆
    0
  • P粉670838735

    P粉6708387352023-08-16 09:09:46

    只需將查詢拆分。您不需要在一行中完成所有操作。

    let query = supabase
        .from("posts")
        .select("*")
        .eq("id", id);
    
    
    if(user.role === "admin"){
        query = query.eq("userId", user.id)
    }
    
    
    const { data: post } = await query.single();

    回覆
    0
  • 取消回覆