2016-06-06 2 views
0

Я имею multple модели в bookself:Bookshelf.js объединить несколько таблиц

пользователя (идентификатор, имя пользователя)

Team (номер, имя)

Skill (номер, имя)

TeamSkill (ID, skill_id, team_id)

TeamSkillUpvote (ID, team_skill_id, идентификатор_пользователя)

Я хотел бы сделать этот вид запроса:

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 

Любой человек может помочь?

Спасибо!

ответ

0

После поиска я нашел ответ ... Он построен в несколько этапов:

1: Определение соотношения для 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: Магия:

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 
    }; 
    } 
} 
Смежные вопросы