簡體   English   中英

Ecto-條件不起作用的多個。 長生不老葯

[英]Ecto - multiple where conditions not working. Elixir

我正在使用Ecto從數據庫中獲取數據。

有一個照相台。 和相機共享表。 我正在嘗試獲取所有相機的owner_id等於給定owner_id的相機。

CameraShare表具有與所有者和攝像機有關的camera_id和user_id。

我試圖將所有相機放在哪里

  • 相機的owner_id =給定的ID

所有這些相機以及位置。

  • CameraShare的user_id =給定ID
  • CameraShare的camera_id =相機的ID

當我執行上述查詢時,我只會得到CameraShare的user_id和camera_id與named_id和相機自己的ID相同的那些相機。

Camera
|> join(:left, [u], cs in CameraShare)
|> where([cam, cs], cs.user_id == ^given_id)
|> where([cam, cs], cam.id == cs.camera_id)
|> preload(:owner)
|> Repo.all

我如何獲得所有相機“所有相機”等於相機所在的相機

|> where([cam], cam.owner_id == ^id)

以及上述條件也得到滿足。 上面已經編寫了Ecto查詢,我只能得到共享的。 不是所有的。

我也嘗試過。 但這不起作用

  Camera
  |> join(:left, [u], cs in CameraShare)
  |> where([cam, cs], cs.user_id in ^account)
  |> where([cam, cs], cam.id == cs.camera_id)
  |> where([cam], cam.owner_id in ^account)
  |> where([cam], like(fragment("lower(?)", cam.name), ^("%#{String.downcase(search)}%")))
  |> preload(:owner)
  |> Evercam.Repo.all

更新:我解決此問題的方法是運行2個查詢。

owned_cameras =
  Camera
  |> where([cam], cam.owner_id in ^account)
  |> where([cam], like(fragment("lower(?)", cam.name), ^("%#{String.downcase(search)}%")))
  |> preload(:owner)
  |> Evercam.Repo.all

shared_cameras =
  Camera
  |> join(:left, [u], cs in CameraShare)
  |> where([cam, cs], cs.user_id in ^account)
  |> where([cam, cs], cam.id == cs.camera_id)
  |> where([cam], like(fragment("lower(?)", cam.name), ^("%#{String.downcase(search)}%")))
  |> preload(:owner)
  |> Evercam.Repo.all

然后將它們與++結合在一起,但仍在尋找一個查詢。

Ecto.Query.union/2有一個大錘變體,但似乎Ecto.Query.or_where/3可能會做得更好。 有點像(我顯然無法測試此代碼,但它應該可以工作):

  Camera
  |> join(:left, [u], cs in CameraShare)
  |> where([cam], like(fragment("lower(?)", cam.name), ^"%STR%")))
  |> where([cam], cam.owner_id in ^account)
  |> or_where([cam], cs.user_id in ^account and cam.id == cs.camera_id)
  |> preload(:owner)
  |> Evercam.Repo.all

另外,默認情況下,大多數RDBMS中的LIKE都不區分大小寫(取決於所使用的排序規則。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM