2017-12-31 28 views
2

Ich habe ein Projekt läuft Laravel 5.5, und ich habe die folgenden Tabellen in der Datenbank.Laravels Beziehung mit Eloquent wirklich richtig?

USERS (
    ID, 
    NAME, 
    PERMISSION_ID 
) 

PERMISSIONS (
    ID, 
    NAME 
) 

Wenn ich nicht falsch bin, NUTZER Beziehung mit PERMISSIONS 1,1 (NUTZER hat mindestens 1 Erlaubnis und maximal 1), so dass es eine OneToOne Beziehung ist.

In meinem Benutzermodell habe ich die folgende Beziehung hergestellt.

class User extends Authenticatable 
{ 
    public function permission() { 
        return $this->hasOne('App\Models\Permission'); 
    } 
} 

Aber auf diese Weise Laravel/Eloquent sucht die Beziehung in der Berechtigungstabelle. Erzeugen eine Auswahl ähnlich wie:

SELECT * FROM PERMISSIONS WHERE PERMISSIONS.USER_ID = 1 

habe ich konsultierte bereits die Laravel Dokumentation und sah, dass ich die ForeignKey und LocalKey im hasOne Methode angeben kann. Dies löst die Beziehung.

Aber ist es wirklich korrekt, dass Laravel/Eloquent standardmäßig die Informationen in der Tabelle PERMISSIONS abruft? Der richtige wäre nicht in der Tabelle USERS mit PERMISSION_ID zu suchen?

@Edit

Durch die Reaktion von Alexey Mezenin

erforschte ich den Unterschied zwischen hasOne und belongsTo. Und ich fand die folgende Antwort:

What is the difference between BelongsTo And HasOne in Laravel

Von dem, was ich verstand, wenn der Fremdschlüssel auf der anderen Tabelle ist die richtige ist hasOne zu verwenden.

Wenn sich der Fremdschlüssel in der eigenen Tabelle der Vorlage befindet, ist die korrekte Verwendung von "belongTo".

Ich bleibe auf diese Details zum nächsten Mal, dank Alexey Mezenin abgestimmt und jedrzej.kurylo

Antwort

1

Ihre Beziehung umgekehrt ist, sind Sie hasOne() statt belongsTo verwenden. Verwenden Sie diese Beziehung im User Modell:

public function permission() 
{ 
    return $this->belongsTo(Permission::class); 
} 

Und im Permission Modell möchten Sie vielleicht hasOne() Beziehung hinzuzufügen (im Falle, wenn Sie es verwenden möchte):

public function user() 
{ 
    return $this->hasOne(User::class); 
} 

Aber in der Regel, die Die gleiche Berechtigung kann von vielen Benutzern verwendet werden. Wenn dies der Fall ist, ändern Sie einfach hasOne in hasMany.