我正在使用ecto从数据库中获取数据。
有一个相机桌。和相机共享表。我正在尝试获取所有相机的所有摄像机,而相机的所有者_id等于给定的所有者_id。
Camerashare表具有与所有者和相机有关的camera_id和user_id。
我正在尝试获取所有摄像机
- 相机的所有者_id =给定ID
所有这些摄像机也在那里。
- camerashare的user_id =给定ID
- Camerashare的Camera_id = Camera的ID
当我进行上述查询时,我只能得到camerashare的user_id和camera_id的那些相机,而vish_id and camera and camera却是自己的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
是不敏感的(取决于所使用的分组。(