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

Przejdź do tematu nadrzędnego

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow