Корма-много через другой стол
У меня есть несколько таблиц, как это:
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
);
Я использую библиотеку Korma в clojure, и я хочу получить запрос, который получает место для идентификатора со списком всех услуг. Пока у меня есть это:
(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 ответ
Корма позаботится о выполнении соединений, поскольку вы уже определили отношения:
(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)))