[英]Ecto - multiple where conditions not working. Elixir
我正在使用Ecto從數據庫中獲取數據。
有一個照相台。 和相機共享表。 我正在嘗試獲取所有相機的owner_id等於給定owner_id的相機。
CameraShare表具有與所有者和攝像機有關的camera_id和user_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.