2017-01-29 2 views
0

Ich kämpfe hart mit Beziehungen in meinem Bücherregal-Modell. Was ich versuche zu tun, Schema zu erstellen, die 4 Tabellen enthält:Bookshelf.js gehört zu viel Abfrage mit falscher Spalte

  • Benutzer
  • Rollen
  • Privilegien
  • privileges_roles

Mit Beziehungen zwischen ihnen wie folgt aus:

Benutzer manyTOone Rollen manyTOone privileges_roles OneToMany Privilegien

Ich habe einfach die Beziehungen zwischen Rechten und Rollen erreicht mit:

Privilegien

class Privileges { 
    constructor() { 
     this.model = bookshelf.Model.extend({ 
      tableName: 'privileges', 
      roles: function() { 
       return this.belongsToMany(Roles.model).through(PrivilegeRole.model); 
      } 
     }); 
    }; 
} 

Rollen

class Roles { 
    constructor() { 
     this.model = bookshelf.Model.extend({ 
      tableName: 'roles', 
      privileges: function() { 
       return this.belongsToMany(Privileges.model).through(PrivilegeRole.model); 
      }, 
      users: function() { 
       return this.hasMany(Users.model); 
      } 
     }); 
    }; 
} 

PrivilegeRole

class PrivilegeRole { 
    constructor() { 
     this.model = bookshelf.Model.extend({ 
      tableName: 'privileges_roles', 
      role: function() { 
       return this.belongsTo(Roles.model); 
      }, 
      privileges: function() { 
       return this.belongsTo(Privileges.model); 
      } 
     }); 
    }; 
} 

Diese Arbeiten wirklich gut. Leider, wenn ich versuche Privilegien zu holen von Benutzer Modell es id halten Einfügen statt ROLE_ID abzufragen.

class Users { 
    constructor() { 
     this.model = bookshelf.Model.extend({ 
      tableName: 'users', 
      role: function() { 
       return this.belongsTo(Role.model); 
      }, 
      privileges: function() { 
       // return this.belongsToMany(Privileges.model).through(PrivilegeRole.model); 
       return this.belongsToMany(Privileges.model, 'privileges_roles', 'role_id', 'privilege_id', 'role_id'); 
      } 
     }); 
    }; 
} 

So am Ende, was ich tun, Bücherregal Abfrage wie folgt schafft:

privileges select *, privileges_roles.. id als _pivot_id, privileges_roles. role_id als _pivot_role_id, privileges_roles. privilege_id als _pivot_privilege_id von privileges innere Verbindung privileges_roles auf privileges_roles. privilege_id = privileges. id wo privileges_roles. role_id in (1)

Statt role_id in (3) wie es ist, in einem Datensatz abgerufen.

Antwort

1

Okay, ich habe endlich eine Lösung gefunden. Statt der bisher benutzten:

privileges: function() { 
       return this.belongsToMany(Privileges.model, 'privileges_roles', 'role_id', 'privilege_id', 'role_id'); 
      } 

musste ich einfach nutzen:

privileges: function() { 
       return this.belongsToMany(Privileges.model).through(PrivilegeRole.model, 'role_id', 'privilege_id', 'role_id'); 
      } 
Verwandte Themen