科马通过另一张桌子

时间:2014-08-06 20:47:43

标签: sql database clojure korma

我有一些像这样的表:

CREATE TABLE place (
    id INTEGER NOT NULL, 
    name VARCHAR(75)
);

CREATE TABLE place_services (
    id INTEGER NOT NULL,
    place_id INTEGER
);

CREATE TABLE service (
    name VARCHAR(100),
    value BOOL,
    place_services_id INTEGER
);

我在clojure中使用Korma库,我希望有一个查询获取id的位置,并列出所有服务。到目前为止,我有这个:

(defentity service)

(defentity place-services
  (table :place_services)
  (has-many service)

(defentity place
  (has-one place-services))

(select place
  (join place-services (= :place_services.place_id :id))
  (join service (= :place_services.id :service.place_services_id))     

这似乎生成了正确的连接,但不包括服务字段。我尝试添加

(fields :service.name)

它返回了其中一个服务名称。我想知道是否有可能在一个查询中获得所有这些列表。感谢

1 个答案:

答案 0 :(得分:1)

Korma将负责处理连接,因为您已经定义了关系:

   (select place (with place-services (with service)))

请注意,这似乎会进行n + 1次查询,因此请检查您的应用是否可以接受。

如果您必须手动添加联接,则您在字段中指定的任何字符串都将传递给查询而不会触及它,因此您可以添加以下所有字段:

(select place
   (fields "service.*")
   (join place-services (= :place_services.place_id :id))
   (join service (= :place_services.id :service.place_services_id)))