关系类型

一对多

让我们说每个帖子可能有一个或多个评论,每个评论只属于一个帖子。

所以评论表将有 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 将返回用户或产品。