关系类型
一对多
让我们说每个帖子可能有一个或多个评论,每个评论只属于一个帖子。
所以评论表将有 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
将返回用户或产品。