關係型別

一對多

讓我們說每個帖子可能有一個或多個評論,每個評論只屬於一個帖子。

所以評論表將有 post_id。在這種情況下,關係如下。

釋出模型

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

如果外來鍵不是 post_id,例如外來鍵是 example_post_id

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

而且,如果本地金鑰不是 id,例如本地金鑰是 other_id

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

評論模型

定義一對多的倒數

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

一對一

如何關聯兩個模型(例如:UserPhone 模型)

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:預設情況下,Eloquent 會將此值假設為 other_model_name_id(在本例中為 user_idphone_id),如果不是這樣則更改它。

local_key:預設情況下,Eloquent 會將此值假設為 id(當前模型主鍵),如果不是這樣,則更改它。

如果你的資料庫按照 laravel 標準歸檔名稱,則不需要在關係宣告中提供外來鍵和本地金鑰

說明

多對多

讓我們說有角色和許可權。每個角色可能屬於許多許可權,每個許可權可能屬於許多角色。所以會有 3 張桌子。兩個型號和一個資料透視表。一個 rolesuserspermission_role 表。

榜樣

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

許可模式

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

注意:1

在為資料透視表使用不同的表名時考慮遵循。

假設你想使用 role_permission 而不是 permission_role,因為雄辯使用字母順序來構建資料透視表名稱。你需要將資料透視表名稱作為第二個引數傳遞,如下所示。

榜樣

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

許可模式

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

筆記 2

在資料透視表中使用不同的鍵名時考慮跟隨。

Eloquent 假設如果沒有鍵作為第三和第四引數傳遞,那麼它將是 _id 的單數表名。因此它假設樞軸將具有 role_idpermission_id 欄位。如果要使用除這些之外的其他鍵,則應將其作為第三個和第四個引數傳遞。

讓我們說如果使用 other_role_id 而不是 role_idother_permission_id 而不是 permission_id。所以它將如下。

榜樣

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

許可模式

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

多型

多型關係允許模型在單個關聯上屬於多個其他模型。一個很好的例子是影象,使用者和產品都可以有影象。表結構可能如下所示:

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

要檢視的重要列在影象表中。imageable_id 列將包含使用者或產品的 ID 值,而 imageable_type 列將包含擁有模型的類名。在模型中,你可以按如下方式設定關係:

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

你還可以通過訪問執行對 morphTo 的呼叫的方法的名稱,從多型模型中檢索多型關係的所有者。在我們的例子中,這是 Image 模型上的 imageable 方法。因此,我們將訪問該方法作為動態屬性

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

$imageable = $image->imageable;

imageable 將返回使用者或產品。