Корма-много через другой стол

У меня есть несколько таблиц, как это:

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)))
Другие вопросы по тегам