Начнем с самого начала. Когда вы передаете элементы в query (), он будет создавать оператор SELECT из этих элементов. Если они являются моделями, то будут перечислены все поля таких моделей. Запрос автоматически добавит таблицы для выбора ОТ.
Если вы не укажете это, запрос не будет выполнять объединения автоматически, поэтому вы должны добавить предположить, из каких таблиц искать ваши значения. Дополнительные предложения, такие как join (), сообщают запросу, как должна выполняться операция JOIN.
Дополнительные аргументы для join () будут использоваться в качестве предложения ON, в противном случае запрос выведет предложение на основе определенных пользователем сопоставлений.
Таким образом, чтобы подвести итог, предложение ON опускается всякий раз, когда вы не указываете дополнительные аргументы для join (). В следующем выражении предложение ON опущено: query(User, Address).join(Address)
Это не означает, что в отправляемом SQL не будет предложения ON; он будет делать правильные вещи, выводя правильное предложение ON, используя отношения, определенные в модели.
Если существует несколько возможностей, вам нужно указать это предложение самостоятельно: query(Person).join(Person.parent1).join(Person.parent2)
должно привести к запросу, который возвращает человека и обоих его родителей. В этом случае предложение ON не было опущено.