如何在ecto查询Ecto中加入多个模型

时间:2019-02-04 04:12:41

标签: postgresql ecto

我有3个模型,分别为VendorVendorModelCamera。我正在执行此查询以获取VendorModels

query = from vm in VendorModel,
          join: v in Vendor, on: vm.vendor_id == v.id,
          where: like(fragment("lower(?)", vm.name), ^("%#{search}%")),
          where: like(fragment("lower(?)", v.name), ^("%#{search}%"))
models = query |> add_sorting(column, order) |> preload(:vendor) |> Evercam.Repo.all()

我正在通过方法add_sorting附加order_by,该方法只会累加order_by,例如

  defp add_sorting(query, "exid", order) do
    from [vm, _v] in query,
      order_by: [{^sort_order(order), vm.exid}]
  end

获取所有模型后,我正在执行Enum.reduce来格式化所有模型上的对象。在每个VendorModel上都有一个与Camera的关联,并且我得到了像

这样的相机中引用的每个模型的计数
  Enum.reduce(display_start..index_end, [], fn i, acc ->
    model = Enum.at(models, i)
    vm = %{
      vendor_exid: model.vendor.exid,
      exid: model.exid,
      camera_count: Camera |> where(model_id: ^model.id) |> Evercam.Repo.all() |> Enum.count(),
    }
    acc ++ [vm]
  end)

这总是为每个模型运行另一个查询,以获取摄像机的数量。是否有可能将此数量查询添加到第一个查询的上方。而且还支持订购吗?

我已经阅读了有关子查询和group_by的信息,但我无法使其工作

感谢您的帮助。

更新:

PostgreSQL查询中的

就是这样

SELECT vendor_models.id, vendor_models.name, v.name, count(cameras.id) as count 
  FROM vendor_models
  INNER JOIN vendors as v ON vendor_models.vendor_id = v.id 
  INNER JOIN cameras ON vendor_models.id = cameras.model_id
  WHERE lower(vendor_models.name) like lower('%ax%') OR lower(v.name) like lower('%ax%')
  GROUP BY vendor_models.id, vendor_models.name, v.name
  ORDER BY v.name asc

但是我不知道ecto会如何。

更新: 最终查询是这样的

SELECT vm.*, v.name as vname, count(cameras.id) as count 
  FROM vendor_models as vm
  INNER JOIN vendors as v ON vm.vendor_id = v.id 
  INNER JOIN cameras ON vm.id = cameras.model_id
  WHERE lower(vm.name) like lower('%ax%') OR lower(v.name) like lower('%ax%')
  GROUP BY vm.id, v.name
  ORDER BY v.name asc

您能帮我将其转换为Ecto吗?

0 个答案:

没有答案