     ///     // SELECT origin.*, target.*
     ///     // FROM origin
     ///     // JOIN target ON target.originId = origin.id
+    ///
+    /// This method works for simple direct associations such as BelongsTo or
+    /// HasMany in the above examples, but also for indirect associations such
+    /// as HasManyThrough, which have any number of pivot relations between the
+    /// origin and the target.
     func joinedRelation(from origin: SQLRelation, required: Bool) -> SQLRelation {
         let targetJoin = SQLJoin(
             isRequired: required,

        return reducedAssociation.joinedRelation(from: origin, required: required)
    }
    
    /// Given an origin alias and rows, returns a relation to the
    /// association target.
    ///
    /// This method provides support for association methods such
    /// as `request(for:)`:

    ///     struct Target: TableRecord { }
    ///     struct Origin: TableRecord, EncodableRecord {
    ///         static let targets = hasMany(Target.self)
    ///         var targets: QueryInterface<Target> {
    ///             return request(for: Origin.targets)
    ///         }
    ///     }
    ///
    ///     // SELECT target.*
    ///     // FROM target
    ///     // WHERE target.originId = 1
    ///     let origin = Origin(id: 1)
    ///     let target = origin.targets.fetchAll(db)
    ///
    /// At low-level, this gives:
    ///
