2016-06-06 12 views
0

I multple Modelle in bookself haben:Bookshelf.js verbinden mehrere Tabellen

Benutzer (id, username)

-Team (id, name)

Fähigkeit (id, name)

TeamSkill (id, skill_id, team_id)

TeamSkillUpvote (id, team_skill_id, user_id)

Ich möchte diese Art der Abfrage machen:

select team.id, team.name, team_skill_upvotes.user_id 
from skill, team_skills, team 
where skill.id = <THE_ID_OF_MY_MODEL> 
and skill.id = team_skills.skill_id 
and team_skills.team_id = team.id 
and team_skills.id = team_skill_upvotes.team_skill_id 

Wer kann helfen?

Danke!

Antwort

0

Nach der Suche ich die Antwort gefunden ... Es ist in wenigen Schritten aufgebaut:

1: Definieren Sie Beziehungen für die TeamSkill:

export interface ITeamSkillRelations { 
    team: Team; 
    upvotes: Collection<TeamSkillUpvote>; 
} 

export class TeamSkill extends bookshelf.Model<TeamSkill>{ 
    ... 
    public relations: ITeamSkillRelations; 

    public upvotes(): Collection<TeamSkillUpvote> { 
    return this.hasMany(TeamSkillUpvote, TeamSkillUpvote.teamSkillIdAttribute/*team_skill_id*/); 
    } 

    public team(): Team { 
    return this.belongsTo(Team, TeamSkill.teamIdAttribute/*team_id*/); 
    } 
    ... 
} 

2: Die Magie:

export class Skill extends bookshelf.Model<Skill> { 
    public getTeams(): Promise<ITeamOfASkill[]> { 
    var fetchOptions: CollectionFetchOptions = { 
     withRelated: [ 
     TeamSkill.relatedTeamSkillUpvotesAttribute/*upvotes*/, 
     TeamSkill.relatedTeamAttribute/*team*/ 
     ] 
    }; 

    return this.teamSkills() 
     .fetch(fetchOptions) 
     .then((teamSkillsCollection: Collection<TeamSkill>) => { 
     var teamSkills: TeamSkill[] = teamSkillsCollection.toArray(); 

     return _.map(teamSkills, _skill => this._convertTeamSkillToTeamOfASkill(_skill)); 
     }); 
    } 

    private _convertTeamSkillToTeamOfASkill(teamSkill: TeamSkill): ITeamOfASkill { 
    var team: Team = teamSkill.relations.team; 

    var upvotesCollection: Collection<TeamSkillUpvote> = teamSkill.relations.upvotes; 
    var upvotes: TeamSkillUpvote[] = upvotesCollection.toArray(); 

    var upvotingIds = 
     _.map(upvotes, _ => _.attributes.user_id); 

    return { 
     team: team, 
     upvotingUserIds: upvotingIds 
    }; 
    } 
}