ecto-多个条件不起作用的地方.长生不老药



我正在使用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是不敏感的(取决于所使用的分组。(

最新更新