Sök…


Frågor om relationer

Eloquent låter dig också fråga om definierade relationer, som visas nedan:

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

Detta kräver att ditt förhållande metodnamn är articles i det här fallet. Argumentet som lämnats in i nedläggningen är Query Builder för den relaterade modellen, så du kan använda alla frågor här som du kan någon annanstans.

Ivrig lastning

Anta att användarmodell har ett förhållande till artikelmodellen och du vill ivrigt ladda relaterade artiklar. Detta betyder att artiklarna från användaren kommer att laddas medan användaren hämtas.

articles är relationens namn (metod) i användarmodell.

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

om du har flera förhållanden. till exempel artiklar och inlägg.

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

och att välja kapslade relationer

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

Ring mer än en kapslad relation

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

Infoga relaterade modeller

Anta att du har en Post med hasMany relation med Comment . Du kan infoga ett Comment relaterat till ett inlägg genom att göra följande:

$post = Post::find(1);

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

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

Du kan spara flera modeller samtidigt med funktionen 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!'])
]);

Alternativt finns det också en create metod som accepterar en vanlig PHP-matris istället för en Eloquent-modellinstans.

$post = Post::find(1);

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

Introduktion

Vältaliga relationer definieras som funktioner i dina Eloquent-modellklasser. Eftersom, liksom Eloquent-modellerna själva, fungerar relationer också som kraftfulla frågeställare, och att definiera relationer som funktioner ger kraftfulla metodkedjnings- och frågefunktioner. Vi kan till exempel kedja ytterligare begränsningar för detta inläggsförhållande:

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

Navigera till överordnat ämne

Förhållande typer

En till många

Låt oss säga att varje inlägg kan ha en eller många kommentarer och varje kommentar tillhör bara ett enda inlägg.

så kommentarstabellen kommer att ha post_id . I detta fall kommer förhållandena att vara följande.

Postmodell

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

Om den utländska nyckeln är annan än post_id är till exempel den utländska nyckeln example_post_id .

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

och plus, om den lokala nyckeln är annan än id , till exempel den lokala nyckeln är other_id

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

Kommentarmodell

definiera invers av en till många

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

En till en

Hur man kopplar mellan två modeller (exempel: User och 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 : Som standard kommer Eloquent att anta att detta värde är other_model_name_id (i detta fall user_id och phone_id ), ändra det om det inte är fallet.

local_key : Som standard kommer Eloquent att anta att detta värde är id (huvudmodell för aktuell modell), ändra det om det inte är fallet.

Om din databas lagrade namn enligt laravelstandard, behöver du inte ange utländsk nyckel och lokal nyckel i relationförklaring

Förklaring

Många till många

Låt oss säga att det finns roller och behörigheter. Varje roll kan tillhöra många behörigheter och varje tillåtelse kan tillhöra många roller. så det kommer att finnas 3 bord. två modeller och ett svängbord. en tabell med roles , users och permission_role .

Förebild

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

Tillståndsmodell

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

Anteckning 1

överväg att följa när du använder ett annat tabellnamn för pivottabellen.

Antar att om du vill använda role_permission istället för permission_role , som vältaliga användningsområden alfabetisk ordning för att bygga de vridnyckelnamnen. du måste skicka pivottabellnamn som andra parameter enligt följande.

Förebild

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

Tillståndsmodell

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

Anteckning 2

överväg att följa när du använder olika nyckelnamn i pivottabellen.

Eloquent antar att om inga nycklar skickas som tredje och fjärde parametrar så kommer det att vara de _id med _id . så den antar att vrid kommer att ha role_id och permission_id fält. Om andra nycklar än dessa ska användas ska det skickas som tredje och fjärde parametrar.

Kan säga om other_role_id stället för role_id och other_permission_id istället för permission_id ska användas. Så det skulle vara som följer.

Förebild

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

Tillståndsmodell

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

polymorf

Polymorfiska relationer tillåter en modell att tillhöra mer än en annan modell i en enda förening. Ett bra exempel är bilder, både en användare och en produkt kan ha en bild. Tabellstrukturen kan se ut enligt följande:

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 viktiga kolumnerna att titta på finns i bildtabellen. imageable_id innehåller användarens eller produktens ID-värde, medan kolumnen imageable_type kommer att innehålla imageable_type för den ägande modellen. I dina modeller konfigurerar du relationerna enligt följande:

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

Du kan också hämta ägaren till en polymorfisk relation från den polymorfa modellen genom att öppna namnet på metoden som utför samtalet till morphTo . I vårt fall är det den imageable metoden på Image-modellen. Så vi kommer åt den metoden som en dynamisk egenskap

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

$imageable = $image->imageable;

Detta imageable kommer att returnera antingen en imageable eller en produkt.

Många till många

Låt oss säga att det finns roller och behörigheter. Varje roll kan tillhöra många behörigheter och varje tillåtelse kan tillhöra många roller. så det kommer att finnas 3 bord. två modeller och ett svängbord. en tabell med roles , users och permission_role .

Förebild

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

Tillståndsmodell

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

Anteckning 1

överväg att följa när du använder ett annat tabellnamn för pivottabellen.

Antar att om du vill använda role_permission istället för permission_role , som vältaliga användningsområden alfabetisk ordning för att bygga de vridnyckelnamnen. du måste skicka pivottabellnamn som andra parameter enligt följande.

Förebild

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

Tillståndsmodell

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

Anteckning 2

överväg att följa när du använder olika nyckelnamn i pivottabellen.

Eloquent antar att om inga nycklar skickas som tredje och fjärde parametrar så kommer det att vara de _id med _id . så den antar att vrid kommer att ha role_id och permission_id fält. Om andra nycklar än dessa ska användas ska det skickas som tredje och fjärde parametrar.

Kan säga om other_role_id stället för role_id och other_permission_id istället för permission_id ska användas. Så det skulle vara som följer.

Förebild

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

Tillståndsmodell

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

Få åtkomst till mellanliggande tabell med withPivot ()

Anta att du har en tredje kolumn " Permission_assigned_date " i pivottabellen. Som standard kommer bara modellnycklarna att finnas på pivotobjektet. För att få den här kolumnen i frågeställningen måste du lägga till namnet i withPivot () -funktionen.

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

Montering / lossning

Eloquent tillhandahåller också några extra hjälpmetoder för att göra arbetet med relaterade modeller mer bekvämt. Låt oss till exempel föreställa oss att en användare kan ha många roller och en roll kan ha många behörigheter. För att knyta en roll till en behörighet genom att infoga en post i mellanliggande tabell som går med i modellerna använder du bifogningsmetoden:

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

När du kopplar en relation till en modell kan du också skicka en rad ytterligare data som ska infogas i mellantabellen:

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

På samma sätt, ta bort en funktion för att ta bort en specifik behörighet mot en roll

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

Synkronisera föreningar

Du kan också använda synkroniseringsmetoden för att konstruera många-till-många föreningar. Synkroniseringsmetoden accepterar en rad ID: er som ska placeras på mellanbordet. Alla ID: er som inte finns i den angivna arrayen kommer att tas bort från mellantabellen. Så efter att denna operation är klar kommer endast ID: erna i den angivna matrisen att finnas i mellanliggande tabell:

//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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow