2016-06-16 7 views
0

Ich habe zwei Modelle User und Businesses.Laravel eloquent - ManyToMany, mehr "Rollen" auf Sigel Pivot-Tabelle

Geschäft können viele Benutzer haben und auch das Geschäft viele Benutzer haben kann.

Zum Beispiel:

  • John ist ein Admin für Business1.
  • John ist ein Superadmin für Business2.
  • Mike ist ein Kunde für Business1.
  • Mike ist ein Teilnehmer für Business1.

Was ist der beste Weg, diese zu verbinden und sie später abzufragen.

baute ich eine Pivot-Tabelle business_user und hinzugefügt Schwenksäulen

 $table->boolean('superadmin')->default(false); 
     $table->boolean('admin')->default(false); 
     $table->boolean('customer')->default(false); 
     $table->boolean('subscriber')->default(false); 

Ist dies der Weg zu gehen oder soll ich es anders machen? Nur andere Dinge, die auftauchen, sind verschiedene Pivot-Tabellen für jeden Typ der Relation, aber es scheint eine schlechte Idee zu sein.

Ich würde fragen diese als:

 $user->businesses()->wherePivot('subscriber',true)->get(); 

Ich hoffe, dass ich nicht die Syntax überall entging, aber wenn ich bitte wegen anderer korrigieren Sie mich tat.

Es gibt auch Redis als nächsten Schritt.

Antwort

1

Ihre Lösung funktioniert gut, aber um später etwas mehr Flexibilität zu ermöglichen (Hinzufügen weiterer Rollen, Definieren von Beziehungen zu Rollen wie Berechtigungen usw.), könnten Sie Folgendes beachten (Achtung, dies führt auch ein wenig ein von Komplexität, so überlegen Sie, ob Sie diese Flexibilität benötigen).

Erstellen Sie ein dediziertes Modell für die Relation (RoleAssignment) und haben Sie auch ein Modell für die verschiedenen Rollen (Role). Dann haben die RoleAssignment drei belongsTo Beziehungen zu Role, User und Business:

class RoleAssignment extends Model { 
    public function role() { 
     return $this->belongsTo(Role::class); 
    } 
    public function user() { 
     return $this->belongsTo(User::class); 
    } 
    public function business() { 
     return $this->belongsTo(Business::class); 
    } 
} 

class Role extends Model { 
    public function roleAssignments() { 
     return $this->hasMany(RoleAssignment::class); 
    } 
} 

class User extends Model { 
    public function roleAssignments() { 
     return $this->hasMany(RoleAssignment::class); 
    } 
    public function businesses($roleName = null) { 
     return $this->hasManyThrough(Business::class, RoleAssignment::class)->where('name'; 
    } 
} 

class Business extends Model { 
    public function roleAssignments() { 
     return $this->hasMany(RoleAssignment::class); 
    } 
} 

Die Abfrage, die Sie gegeben haben, dann wie folgt geschrieben werden:

$user->roleAssignments()->whereHas('role', function ($query) { 
    return $query->where('name', 'subscriber'); 
})->with('business')->get()->pluck('business'); 

dies ein wenig zu vereinfachen, Sie könnte Ihren roleAssignments Bezug auf das User Modell ändert ein optionalen Rollennamen zu akzeptieren:

class User extends Model { 
    public function roleAssignments($roleName = null) { 
     $relation = $this->hasMany(RoleAssignment::class); 
     if ($relation) { 
      $relation->whereHas('role', function ($query) { 
       return $query->where('name', 'subscriber'); 
      }); 
     } 
     return $relation; 
    } 
} 

Jetzt können Sie diese Abfrage schreiben:

$user->roleAssignments('subscriber')->with('business')->get()->pluck('business'); 
+0

Vielen Dank für Ihre Zeit. Ich brauche nicht so viel Flexibilität, aber ich brauche benutzerdefinierte Berechtigungen (Abonnent kann nicht die gleichen Dinge wie Admin und ähnliches tun). Ich denke jedoch, dass es mit meiner Einrichtung leicht machbar ist. Ich werde Ihr Beispiel genauer studieren, da es etwas ist, das ich in Zukunft sicher brauchen werde. – dbr