關係型別
一對多
讓我們說每個帖子可能有一個或多個評論,每個評論只屬於一個帖子。
所以評論表將有 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);
}
一對一
如何關聯兩個模型(例如:User
和 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
:預設情況下,Eloquent 會將此值假設為 other_model_name_id
(在本例中為 user_id
和 phone_id
),如果不是這樣則更改它。
local_key
:預設情況下,Eloquent 會將此值假設為 id
(當前模型主鍵),如果不是這樣,則更改它。
如果你的資料庫按照 laravel 標準歸檔名稱,則不需要在關係宣告中提供外來鍵和本地金鑰
說明
多對多
讓我們說有角色和許可權。每個角色可能屬於許多許可權,每個許可權可能屬於許多角色。所以會有 3 張桌子。兩個型號和一個資料透視表。一個 roles
,users
和 permission_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_id
和 permission_id
欄位。如果要使用除這些之外的其他鍵,則應將其作為第三個和第四個引數傳遞。
讓我們說如果使用 other_role_id
而不是 role_id
和 other_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
將返回使用者或產品。