Szukaj…
Zapytanie o relacje
Eloquent pozwala również na zapytania dotyczące zdefiniowanych relacji, jak pokazano poniżej:
User::whereHas('articles', function (Builder $query) {
$query->where('published', '!=', true);
})->get();
Wymaga to, aby nazwą metody relacji były w tym przypadku articles
. Argumentem przekazanym do zamknięcia jest Konstruktor kwerend dla powiązanego modelu, dzięki czemu można tutaj użyć dowolnych zapytań, które można gdzie indziej.
Chętnie ładuję
Załóżmy, że model użytkownika ma związek z modelem artykułu i chcesz chętnie załadować powiązane artykuły. Oznacza to, że artykuły użytkownika zostaną załadowane podczas pobierania użytkownika.
articles
to nazwa (metoda) relacji w modelu użytkownika.
User::with('articles')->get();
jeśli masz wiele relacji. na przykład artykuły i posty.
User::with('articles','posts')->get();
i wybrać zagnieżdżone relacje
User::with('posts.comments')->get();
Zadzwoń do więcej niż jednego zagnieżdżonego związku
User::with('posts.comments.likes')->get()
Wstawianie modeli pokrewnych
Załóżmy, że masz model Post
z hasMany
relacjami z Comment
. Możesz wstawić obiekt Comment
związany z postem, wykonując następujące czynności:
$post = Post::find(1);
$commentToAdd = new Comment(['message' => 'This is a comment.']);
$post->comments()->save($commentToAdd);
Możesz zapisać wiele modeli jednocześnie za pomocą funkcji 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!'])
]);
Alternatywnie istnieje również metoda create
, która akceptuje zwykłą tablicę PHP zamiast instancji modelu Eloquent.
$post = Post::find(1);
$post->comments()->create([
'message' => 'This is a new comment message'
]);
Wprowadzenie
Relacje elokwentne są zdefiniowane jako funkcje w twoich klasach Elokwentny model. Ponieważ, podobnie jak same modele Eloquent, relacje służą również jako potężne konstruktory zapytań, definiowanie relacji jako funkcji zapewnia potężne możliwości łączenia łańcuchów i tworzenia zapytań. Na przykład możemy powiązać dodatkowe ograniczenia relacji między tymi postami:
$user->posts()->where('active', 1)->get();
Rodzaje relacji
Jeden za dużo
Powiedzmy, że każdy post może mieć jeden lub wiele komentarzy, a każdy komentarz należy do jednego postu.
więc tabela komentarzy będzie miała post_id
. W takim przypadku relacje będą następujące.
Model postu
public function comments()
{
return $this->belongsTo(Post::class);
}
Jeśli klucz obcy jest inny niż post_id
, na przykład klucz obcy to example_post_id
.
public function comments()
{
return $this->belongsTo(Post::class, 'example_post_id');
}
i plus, jeśli klucz lokalny jest inny niż id
, na przykład klucz lokalny to other_id
public function comments()
{
return $this->belongsTo(Post::class, 'example_post_id', 'other_id');
}
Model komentarza
definiowanie odwrotności jednego do wielu
public function post()
{
return $this->hasMany(Comment::class);
}
Jeden na jednego
Jak powiązać dwa modele (przykład: model User
i 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
: Domyślnie Eloquent przyjmie tę wartość jako other_model_name_id
(w tym przypadku user_id
i phone_id
), zmień go, jeśli nie jest to przypadek.
local_key
: Domyślnie Eloquent przyjmie tę wartość jako id
(klucz podstawowy obecnego modelu), zmień ją, jeśli tak nie jest.
Jeśli nazwa bazy danych zawiera nazwę zgodną ze standardem laravel, nie trzeba podawać klucza obcego i klucza lokalnego w deklaracji relacji
Wyjaśnienie
Wiele do wielu
Powiedzmy, że istnieją role i uprawnienia. Każda rola może należeć do wielu uprawnień, a każde uprawnienie może należeć do wielu ról. więc będą 3 stoły. dwa modele i jeden stół przestawny. tabela roles
, users
i permission_role
.
Wzór do naśladowania
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
Model uprawnień
public function roles()
{
return $this->belongsToMany(Roles::class);
}
Notatka 1
weź pod uwagę następujące, używając innej nazwy tabeli dla tabeli przestawnej.
Załóżmy, że chcesz użyć permission_role
role_permission
zamiast permission_role
, ponieważ elokwentny używa kolejności alfabetycznej do budowania nazw kluczy przestawnych. musisz przekazać nazwę tabeli przestawnej jako drugi parametr w następujący sposób.
Wzór do naśladowania
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission');
}
Model uprawnień
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission');
}
Uwaga: 2
rozważ stosowanie następujących przy użyciu różnych nazw kluczy w tabeli przestawnej.
Eloquent zakłada, że jeśli żaden klucz nie zostanie przekazany jako trzeci i czwarty parametr, to będą to nazwy tabeli pojedynczej z _id
. dlatego zakłada, że oś będzie o role_id
i permission_id
pól. Jeśli mają być używane klucze inne niż te, należy podać je jako trzeci i czwarty parametr.
Powiedzmy, jeśli other_role_id
zamiast role_id
i other_permission_id
zamiast permission_id
ma być używany. Byłoby to następująco.
Wzór do naśladowania
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}
Model uprawnień
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}
Polimorficzny
Relacje polimorficzne pozwalają modelowi należeć do więcej niż jednego innego modelu w jednym skojarzeniu. Dobrym przykładem mogą być obrazy, zarówno użytkownik, jak i produkt mogą mieć obraz. Struktura tabeli może wyglądać następująco:
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
Ważne kolumny do obejrzenia znajdują się w tabeli obrazów. Kolumna imageable_id
będzie zawierać wartość ID użytkownika lub produktu, natomiast kolumna imageable_type
będzie zawierać nazwę klasy modelu będącego właścicielem. W swoich modelach konfigurujesz relacje w następujący sposób:
<?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');
}
}
Możesz także odzyskać właściciela relacji polimorficznej z modelu polimorficznego, uzyskując dostęp do nazwy metody, która wykonuje wywołanie morphTo
. W naszym przypadku jest to metoda imageable
do imageable
w modelu obrazu. Tak więc uzyskamy dostęp do tej metody jako właściwości dynamicznej
$image = App\Image::find(1);
$imageable = $image->imageable;
Ten imageable
może zwrócić albo użytkownika, albo produktu.
Many To Many
Powiedzmy, że istnieją role i uprawnienia. Każda rola może należeć do wielu uprawnień, a każde uprawnienie może należeć do wielu ról. więc będą 3 stoły. dwa modele i jeden stół przestawny. tabela roles
, users
i permission_role
.
Wzór do naśladowania
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
Model uprawnień
public function roles()
{
return $this->belongsToMany(Roles::class);
}
Notatka 1
weź pod uwagę następujące, używając innej nazwy tabeli dla tabeli przestawnej.
Załóżmy, że chcesz użyć permission_role
role_permission
zamiast permission_role
, ponieważ elokwentny używa kolejności alfabetycznej do budowania nazw kluczy przestawnych. musisz przekazać nazwę tabeli przestawnej jako drugi parametr w następujący sposób.
Wzór do naśladowania
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission');
}
Model uprawnień
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission');
}
Uwaga: 2
rozważ stosowanie następujących przy użyciu różnych nazw kluczy w tabeli przestawnej.
Eloquent zakłada, że jeśli żaden klucz nie zostanie przekazany jako trzeci i czwarty parametr, to będą to nazwy tabeli pojedynczej z _id
. dlatego zakłada, że oś będzie o role_id
i permission_id
pól. Jeśli mają być używane klucze inne niż te, należy podać je jako trzeci i czwarty parametr.
Powiedzmy, jeśli other_role_id
zamiast role_id
i other_permission_id
zamiast permission_id
ma być używany. Byłoby to następująco.
Wzór do naśladowania
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id');
}
Model uprawnień
public function roles()
{
return $this->belongsToMany(Roles::class, 'role_permission', 'other_permission_id', 'other_role_id');
}
Dostęp do tabeli pośredniej za pomocą withPivot ()
Załóżmy, że w tabeli przestawnej znajduje się trzecia kolumna „ zezwolenie_dodana_data ”. Domyślnie tylko klucze modelu będą obecne na obiekcie przestawnym. Teraz, aby uzyskać tę kolumnę w wyniku zapytania, musisz dodać nazwę w funkcji withPivot ().
public function permissions()
{
return $this->belongsToMany(Permission::class, 'role_permission', 'other_role_id', 'other_permission_id')->withPivot('permission_assigned_date');
}
Dołączanie / odłączanie
Eloquent zapewnia również kilka dodatkowych metod pomocniczych, które ułatwiają pracę z powiązanymi modelami. Wyobraźmy sobie na przykład, że użytkownik może mieć wiele ról, a rola może mieć wiele uprawnień. Aby dołączyć rolę do uprawnienia, wstawiając rekord do tabeli pośredniej, która łączy modele, użyj metody attach:
$role= App\Role::find(1);
$role->permissions()->attach($permissionId);
Podczas dołączania relacji do modelu możesz również przekazać tablicę dodatkowych danych, które zostaną wstawione do tabeli pośredniej:
$rol->roles()->attach($permissionId, ['permission_assigned_date' => $date]);
Podobnie, aby usunąć określone uprawnienie przeciwko roli, użyj funkcji odłączania
$role= App\Role::find(1);
//will remove permission 1,2,3 against role 1
$role->permissions()->detach([1, 2, 3]);
Synchronizowanie skojarzeń
Możesz także użyć metody synchronizacji do zbudowania powiązań wiele do wielu. Metoda synchronizacji przyjmuje tablicę identyfikatorów do umieszczenia w tabeli pośredniej. Wszelkie identyfikatory, których nie ma w podanej tablicy, zostaną usunięte z tabeli pośredniej. Po zakończeniu tej operacji w tabeli pośredniej będą istnieć tylko identyfikatory w podanej tablicy:
//will keep permission id's 1,2,3 against Role id 1
$role= App\Role::find(1)
$role->permissions()->sync([1, 2, 3]);