我有一些这样的表:
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)
返回其中一个服务名称。我想知道是否有可能在一个查询中获得所有这些列表。由于
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)))