我有3个模型,分别为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()
我正在通过方法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吗?