代码之家  ›  专栏  ›  技术社区  ›  Junaid Farooq

如何将多个模型连接到on-octo查询中

  •  1
  • Junaid Farooq  · 技术社区  · 7 年前

    我有三个模型 Vendor , VendorModel Camera . 我做这个查询是为了 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()
    

    我在追加 order_by 通过方法add_sorting只将 订货人 例如

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

    在得到所有我正在做的模型之后 Enum.reduce 格式化所有模型上的对象。在每个 供应商模型 ,我将得到相机中引用的每个模型的计数,例如

      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)
    

    这总是为每个模型运行另一个查询来获取摄像机的计数,是否有可能将此计数查询添加到第一个查询的上方。它还支持order by?

    我已经读过subquery和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
    

    但我不知道怎么会在体外。

    更新: 最终查询如下

    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
    

    你能帮我把它转换成外阴吗?

    0 回复  |  直到 7 年前