Suche…


Fragen zu Beziehungen abfragen

Mit Eloquent können Sie auch nach definierten Beziehungen abfragen, wie unten gezeigt:

User::whereHas('articles', function (Builder $query) {
    $query->where('published', '!=', true);
})->get();

Dies setzt voraus, dass der Name Ihrer Beziehungsmethode in diesem Fall articles ist. Das in die Schließung übergebene Argument ist der Query Builder für das zugehörige Modell. Sie können hier also jede andere Abfrage verwenden.

Eifriges Laden

Angenommen, das Benutzermodell hat eine Beziehung zum Artikelmodell und Sie möchten die zugehörigen Artikel gerne laden. Dies bedeutet, dass die Artikel des Benutzers geladen werden, während der Benutzer abgerufen wird.

articles ist der Beziehungsname (Methode) im Benutzermodell.

User::with('articles')->get();

wenn Sie mehrere Beziehungen haben. zum Beispiel Artikel und Beiträge.

User::with('articles','posts')->get();

und geschachtelte Beziehungen auswählen

User::with('posts.comments')->get();

Rufen Sie mehr als eine verschachtelte Beziehung an

User::with('posts.comments.likes')->get()

Verwandte Modelle einfügen

Angenommen, Sie haben ein Post Modell mit einer hasMany Beziehung zu Comment . Sie können ein Comment Objekt einfügen, das sich auf einen Beitrag bezieht, indem Sie folgende Schritte Comment :

$post = Post::find(1);

$commentToAdd = new Comment(['message' => 'This is a comment.']);

$post->comments()->save($commentToAdd);

Sie können mit der saveMany Funktion mehrere Modelle gleichzeitig saveMany :

$post = Post::find(1);

$post->comments()->saveMany([
    new Comment(['message' => 'This a new comment']),
    new Comment(['message' => 'Me too!']),
    new Comment(['message' => 'Eloquent is awesome!'])
]);

Alternativ gibt es auch eine create Methode, die ein einfaches PHP-Array anstelle einer Eloquent-Modellinstanz akzeptiert.

$post = Post::find(1);

$post->comments()->create([
    'message' => 'This is a new comment message'
]);

Einführung

Eloquente Beziehungen werden als Funktionen in Ihren Eloquent-Modellklassen definiert. Da Beziehungen wie Eloquent-Modelle selbst auch als leistungsstarke Abfrageersteller dienen, bietet das Definieren von Beziehungen als Funktionen leistungsstarke Methoden zur Verkettung und Abfrage von Methoden. Zum Beispiel können wir zusätzliche Einschränkungen für diese Beitragsbeziehung verketten:

$user->posts()->where('active', 1)->get();

Navigieren Sie zum übergeordneten Thema

Beziehungstypen

Eins zu vielen

Nehmen wir an, dass jeder Beitrag einen oder mehrere Kommentare haben kann und jeder Kommentar zu einem einzigen Beitrag gehört.

so wird die Kommentartabelle post_id . In diesem Fall sind die Beziehungen wie folgt.

Post Model

public function comments()
{
   return $this->belongsTo(Post::class);
}

Wenn der Fremdschlüssel nicht post_id , lautet der example_post_id .

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id');
}

und, wenn der lokale Schlüssel anders als id , ist beispielsweise der lokale Schlüssel other_id

public function comments()
{
   return $this->belongsTo(Post::class, 'example_post_id', 'other_id');
}

Kommentarmodell

Umkehrung von eins zu vielen definieren

public function post()
{
   return $this->hasMany(Comment::class);
}

Eins zu eins

Zuordnung zwischen zwei Modellen (Beispiel: User und Phone )

App\User

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the phone record associated with the user.
     */
    public function phone()
    {
        return $this->hasOne('Phone::class', 'foreign_key', 'local_key');
    }
}

App\Phone

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('User::class', 'foreign_key', 'local_key');
    }
}

foreign_key : Standardmäßig geht Eloquent davon aus, dass es sich um other_model_name_id (in diesem Fall user_id und phone_id ). Ändern Sie ihn, falls dies nicht der Fall ist.

local_key : Eloquent geht standardmäßig davon aus, dass es sich um eine id (aktuelles Modell-Primärschlüssel) handelt. Ändern Sie ihn, falls dies nicht der Fall ist.

Wenn der Name Ihrer Datenbank gemäß dem Laravel-Standard abgelegt wurde, müssen Sie bei der Beziehungsdeklaration keinen Fremdschlüssel und keinen lokalen Schlüssel angeben

Erläuterung

Viel zu viel

Nehmen wir an, es gibt Rollen und Berechtigungen. Jede Rolle kann zu vielen Berechtigungen gehören und jede Berechtigung kann zu vielen Rollen gehören. also gibt es 3 tische. zwei Modelle und ein Pivot-Tisch. eine roles , users und permission_role .

Vorbild

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

Zulassungsmodell

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

Anmerkung 1

Beachten Sie Folgendes, wenn Sie einen anderen Tabellennamen für die Pivot-Tabelle verwenden.

Angenommen, Sie möchten role_permission anstelle von permission_role , da eloquent die alphabetische Reihenfolge zum role_permission der Pivot-Schlüsselnamen verwendet. Als zweiten Parameter müssen Sie den Namen der Pivot-Tabelle wie folgt übergeben.

Vorbild

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

Zulassungsmodell

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

Anmerkung 2

Beachten Sie Folgendes, wenn Sie unterschiedliche Schlüsselnamen in der Pivot-Tabelle verwenden.

Eloquent geht davon aus, dass, wenn keine Schlüssel als dritter und vierter Parameter übergeben werden, es die singulären Tabellennamen mit _id . Es wird also davon role_id dass der Drehpunkt die Felder role_id und permission_id . Wenn andere Schlüssel als diese verwendet werden sollen, sollten sie als dritter und vierter Parameter übergeben werden.

Sagen wir, wenn other_role_id anstelle von role_id und other_permission_id anstelle von permission_id verwendet werden soll. Es wäre also wie folgt.

Vorbild

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

Zulassungsmodell

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

Polymorph

Durch polymorphe Beziehungen kann ein Modell zu mehr als einem anderen Modell in einer einzelnen Assoziation gehören. Ein gutes Beispiel wären Bilder, sowohl ein Benutzer als auch ein Produkt können ein Bild haben. Die Tabellenstruktur könnte folgendermaßen aussehen:

user
    id - integer
    name - string
    email - string

product
    id - integer
    title - string
    SKU - string

image
    id - integer
    url - string
    imageable_id - integer
    imageable_type - string

Die wichtigsten zu betrachtenden Spalten befinden sich in der Bildtabelle. Die Spalte mit dem Namen " imageable_id " enthält den ID-Wert des Benutzers oder des Produkts, während die Spalte mit dem Namen " imageable_type den Klassennamen des Besitzermodells enthält. In Ihren Modellen richten Sie die Beziehungen wie folgt ein:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    /**
     * Get all of the owning imageable models.
     */
    public function imageable()
    {
        return $this->morphTo();
    }
}

class User extends Model
{
    /**
     * Get all of the user's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

class Product extends Model
{
    /**
     * Get all of the product's images.
     */
    public function images()
    {
        return $this->morphMany('Image::class', 'imageable');
    }
}

Sie können den Besitzer einer polymorphen Beziehung auch aus dem polymorphen Modell abrufen, indem Sie auf den Namen der Methode zugreifen, die den Aufruf von morphTo . In unserem Fall ist dies die imageable Methode des Image-Modells. Wir werden also auf diese Methode als dynamische Eigenschaft zugreifen

$image = App\Image::find(1);

$imageable = $image->imageable;

Dieses imageable gibt entweder einen Benutzer oder ein Produkt zurück.

Viel zu viel

Nehmen wir an, es gibt Rollen und Berechtigungen. Jede Rolle kann zu vielen Berechtigungen gehören und jede Berechtigung kann zu vielen Rollen gehören. also gibt es 3 tische. zwei Modelle und ein Pivot-Tisch. eine roles , users und permission_role .

Vorbild

public function permissions()
{
   return $this->belongsToMany(Permission::class);
}

Zulassungsmodell

public function roles()
{
   return $this->belongsToMany(Roles::class);
}

Anmerkung 1

Beachten Sie Folgendes, wenn Sie einen anderen Tabellennamen für die Pivot-Tabelle verwenden.

Angenommen, Sie möchten role_permission anstelle von permission_role , da eloquent die alphabetische Reihenfolge zum role_permission der Pivot-Schlüsselnamen verwendet. Als zweiten Parameter müssen Sie den Namen der Pivot-Tabelle wie folgt übergeben.

Vorbild

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission');
}

Zulassungsmodell

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission');
}

Anmerkung 2

Beachten Sie Folgendes, wenn Sie unterschiedliche Schlüsselnamen in der Pivot-Tabelle verwenden.

Eloquent geht davon aus, dass, wenn keine Schlüssel als dritter und vierter Parameter übergeben werden, es die singulären Tabellennamen mit _id . Es wird also davon role_id dass der Drehpunkt die Felder role_id und permission_id . Wenn andere Schlüssel als diese verwendet werden sollen, sollten sie als dritter und vierter Parameter übergeben werden.

Sagen wir, wenn other_role_id anstelle von role_id und other_permission_id anstelle von permission_id verwendet werden soll. Es wäre also wie folgt.

Vorbild

public function permissions()
{
   return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}

Zulassungsmodell

public function roles()
{
   return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}

Zugriff auf die Zwischentabelle mit withPivot ()

Angenommen, Sie haben eine dritte Spalte " permission_assigned_date " in der Pivot-Tabelle. Standardmäßig sind nur die Modellschlüssel im Pivot-Objekt vorhanden. Um diese Spalte im Abfrageergebnis zu erhalten, müssen Sie den Namen in der Funktion withPivot () hinzufügen.

   public function permissions()
        {
           return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
        }

Anbringen / Abnehmen

Eloquent bietet auch einige zusätzliche Hilfsmethoden, um das Arbeiten mit verwandten Modellen zu erleichtern. Nehmen wir beispielsweise an, ein Benutzer kann viele Rollen haben und eine Rolle kann viele Berechtigungen haben. Um einer Berechtigung eine Rolle zuzuordnen, indem Sie einen Datensatz in die Zwischentabelle einfügen, die die Modelle verbindet, verwenden Sie die Methode attach:

$role= App\Role::find(1);    
$role->permissions()->attach($permissionId);

Beim Anhängen einer Beziehung an ein Modell können Sie auch ein Array zusätzlicher Daten übergeben, die in die Zwischentabelle eingefügt werden sollen:

$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);

Um eine bestimmte Berechtigung für eine Rolle zu entfernen, verwenden Sie die Trennungsfunktion

$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);

Zuordnungen synchronisieren

Sie können die Synchronisationsmethode auch verwenden, um viele-zu-viele-Verknüpfungen aufzubauen. Die Synchronisationsmethode akzeptiert ein Array von IDs, die in der Zwischentabelle platziert werden sollen. IDs, die sich nicht im angegebenen Array befinden, werden aus der Zwischentabelle entfernt. Nach Abschluss dieses Vorgangs sind also nur die IDs des angegebenen Arrays in der Zwischentabelle vorhanden:

//will keep permission id's 1,2,3 against Role id 1

$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow