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]);