Zoeken…


Vragen stellen over relaties

Met Eloquent kunt u ook zoeken op gedefinieerde relaties, zoals hieronder wordt getoond:

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

Dit vereist dat uw relatiemethode in dit geval articles is. Het argument dat aan de afsluiting is doorgegeven is de Query Builder voor het gerelateerde model, dus u kunt hier alle vragen gebruiken die u elders kunt gebruiken.

Populair laden

Stel dat het gebruikersmodel een relatie heeft met het artikelmodel en dat u de gerelateerde artikelen graag wilt laden. Dit betekent dat de artikelen van de gebruiker worden geladen tijdens het ophalen van de gebruiker.

articles is de relatienaam (methode) in Gebruikersmodel.

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

als u meerdere relaties heeft. bijvoorbeeld artikelen en berichten.

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

en om geneste relaties te selecteren

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

Bel meer dan één geneste relatie

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

Gerelateerde modellen invoegen

Stel je hebt een Post model met een hasMany relatie met Comment . U kunt een steek Comment object gerelateerd is aan een bericht door het volgende te doen:

$post = Post::find(1);

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

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

U kunt meerdere modellen tegelijk opslaan met de functie 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!'])
]);

Als alternatief is er ook een create werkwijze waarmee een effen PHP array accepteert plaats van een Welsprekende modelvorm.

$post = Post::find(1);

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

Invoering

Welsprekende relaties worden gedefinieerd als functies in uw Welsprekende modelklassen. Omdat, net als Eloquent-modellen zelf, relaties ook dienen als krachtige query-builders, biedt het definiëren van relaties als functies krachtige methoden voor het koppelen en bevragen van methoden. We kunnen bijvoorbeeld aanvullende beperkingen opleggen voor deze berichtrelatie:

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

Navigeer naar bovenliggend onderwerp

Typen relaties

Een te veel

Laten we zeggen dat elk bericht één of meerdere reacties kan bevatten en elke reactie tot slechts één bericht behoort.

dus de tabel met opmerkingen heeft post_id . In dit geval zijn de relaties als volgt.

Postmodel

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

Als de externe sleutel anders is dan post_id , is de externe sleutel example_post_id .

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

en plus, als de lokale sleutel anders is dan id , is de lokale sleutel bijvoorbeeld other_id

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

Commentaarmodel

definieert omgekeerd van één tot veel

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

Een op een

Hoe te associëren tussen twee modellen (bijvoorbeeld: User en 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 : Standaard zal Eloquent aannemen dat deze waarde other_model_name_id (in dit geval user_id en phone_id ), wijzig deze als dit niet het geval is.

local_key : Standaard zal Eloquent aannemen dat deze waarde id (primaire sleutel van het huidige model), wijzig deze als dit niet het geval is.

Als uw database de ingevoerde naam volgens de laravelstandaard heeft, hoeft u geen externe sleutel en lokale sleutel op te geven in de relatieverklaring

Uitleg

Veel te veel

Laten we zeggen dat er rollen en machtigingen zijn. Elke rol kan bij veel machtigingen horen en elke machtiging kan bij veel rollen horen. dus er zullen 3 tafels zijn. twee modellen en één draaitabel. een tabel met roles , users en permission_role .

Rolmodel

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

Toestemmingsmodel

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

Notitie 1

overweeg het volgende te doen terwijl u een andere tabelnaam gebruikt voor de draaitabel.

Stel dat u role_permission wilt gebruiken role_permission plaats van permission_role , omdat welsprekend alfabetische volgorde gebruikt voor het role_permission van de namen van de pivot key. u moet de draaitabelnaam als tweede parameter als volgt doorgeven.

Rolmodel

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

Toestemmingsmodel

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

Opmerking: 2

overweeg om tijdens het gebruik van verschillende sleutelnamen in de draaitabel te gebruiken.

Eloquent neemt aan dat als er geen sleutels worden doorgegeven als derde en vierde parameter, dit de enkelvoudige _id met _id . dus wordt ervan uitgegaan dat de pivot de velden role_id en permission_id heeft. Als andere sleutels dan deze moeten worden gebruikt, moeten deze als derde en vierde parameter worden doorgegeven.

Laten we zeggen of other_role_id plaats van role_id en other_permission_id plaats van permission_id moet worden gebruikt. Dus het zou als volgt zijn.

Rolmodel

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

Toestemmingsmodel

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

polymorfe

Polymorfe relaties maken het mogelijk dat een model tot meer dan één ander model van een enkele associatie behoort. Een goed voorbeeld zijn afbeeldingen, zowel een gebruiker als een product kunnen een afbeelding hebben. De tabelstructuur kan er als volgt uitzien:

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

De belangrijke kolommen om naar te kijken staan in de afbeeldingstabel. De kolom imageable_id bevat de ID-waarde van de gebruiker of het product, terwijl de kolom imageable_type de klassenaam van het model bevat. In uw modellen stelt u de relaties als volgt in:

<?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');
    }
}

U kunt ook de eigenaar van een polymorfe relatie ophalen uit het polymorfe model door toegang te krijgen tot de naam van de methode die de aanroep van morphTo . In ons geval is dat de imageable methode op het beeldmodel. Dus we zullen toegang krijgen tot die methode als een dynamische eigenschap

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

$imageable = $image->imageable;

Deze imageable retourneert een gebruiker of een product.

Veel te veel

Laten we zeggen dat er rollen en machtigingen zijn. Elke rol kan bij veel machtigingen horen en elke machtiging kan bij veel rollen horen. dus er zullen 3 tafels zijn. twee modellen en één draaitabel. een tabel met roles , users en permission_role .

Rolmodel

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

Toestemmingsmodel

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

Notitie 1

overweeg het volgende te doen terwijl u een andere tabelnaam gebruikt voor de draaitabel.

Stel dat u role_permission wilt gebruiken role_permission plaats van permission_role , omdat welsprekend alfabetische volgorde gebruikt voor het role_permission van de namen van de pivot key. u moet de draaitabelnaam als tweede parameter als volgt doorgeven.

Rolmodel

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

Toestemmingsmodel

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

Opmerking: 2

overweeg om tijdens het gebruik van verschillende sleutelnamen in de draaitabel te gebruiken.

Eloquent neemt aan dat als er geen sleutels worden doorgegeven als derde en vierde parameter, dit de enkelvoudige _id met _id . dus wordt ervan uitgegaan dat de pivot de velden role_id en permission_id heeft. Als andere sleutels dan deze moeten worden gebruikt, moeten deze als derde en vierde parameter worden doorgegeven.

Laten we zeggen of other_role_id plaats van role_id en other_permission_id plaats van permission_id moet worden gebruikt. Dus het zou als volgt zijn.

Rolmodel

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

Toestemmingsmodel

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

Toegang tot de tussentabel met behulp van withPivot ()

Stel dat u een derde kolom ' Permission_assigned_date ' in de draaitabel hebt. Standaard zijn alleen de modelsleutels aanwezig op het pivot-object. Om deze kolom in het queryresultaat te krijgen, moet u de naam toevoegen in de functie withPivot ().

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

Bevestigen / losmaken

Eloquent biedt ook een paar extra hulpmethoden om het werken met gerelateerde modellen gemakkelijker te maken. Laten we ons bijvoorbeeld voorstellen dat een gebruiker veel rollen kan hebben en een rol veel machtigingen kan hebben. Gebruik de methode attach om een rol aan een toestemming te koppelen door een record in te voegen in de tussentabel die bij de modellen hoort:

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

Wanneer u een relatie aan een model koppelt, kunt u ook een reeks extra gegevens doorgeven die u in de tussentabel wilt invoegen:

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

Op dezelfde manier gebruikt u de ontkoppelingsfunctie om een specifieke machtiging tegen een rol te verwijderen

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

Koppelingen synchroniseren

U kunt ook de synchronisatiemethode gebruiken om veel-op-veel associaties te maken. De synchronisatiemethode accepteert een reeks ID's om op de tussentabel te plaatsen. ID's die niet in de gegeven array voorkomen, worden uit de tussentijdse tabel verwijderd. Dus, nadat deze bewerking voltooid is, zullen alleen de ID's in de gegeven array in de tussentijdse tabel bestaan:

//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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow