📜  laravel 多态关系为什么需要这种关系形式, - PHP (1)

📅  最后修改于: 2023-12-03 15:32:34.910000             🧑  作者: Mango

Laravel 多态关系介绍

在 Laravel 中,我们经常会使用到多态关系(Polymorphic Relation)这种关系形式。那么,什么是多态关系呢?

多态关系是指一个模型可以属于多个其他模型(父模型),同时一个父模型也可以拥有多个不同类型的子模型。

在实际开发中,多态关系经常用于处理一些共享关系的情况,比如文章、评论、标签等多个模型都可以被多个其他模型引用。

Laravel 多态关系示例

下面我们通过一个简单的示例来说明 Laravel 多态关系的使用。

假设我们有三个模型:UserPostComment。现在我们需要实现以下两种关系:

  1. 一个用户可以点赞多篇文章和多条评论。
  2. 一个文章和一条评论都可以被多个用户点赞。

为了实现这种关系,我们可以使用 Laravel 的多态关系模型。

首先,我们需要为 User 模型建立一个 likes 的多态关系:

use Illuminate\Database\Eloquent\Relations\MorphToMany;

class User extends Authenticatable
{
    public function likes(): MorphToMany
    {
        return $this->morphToMany(Likeable::class, 'likeable');
    }
}

然后,在需要用到多态关系的模型中,我们需要实现 Likeable 接口:

use Illuminate\Database\Eloquent\Relations\MorphMany;

interface Likeable
{
    public function likes(): MorphMany;
}

PostComment 模型中实现该接口:

class Post extends Model implements Likeable
{
    public function likes(): MorphMany
    {
        return $this->morphMany(Like::class, 'likeable');
    }
}

class Comment extends Model implements Likeable
{
    public function likes(): MorphMany
    {
        return $this->morphMany(Like::class, 'likeable');
    }
}

其中,Like 模型用于存储点赞信息:

class Like extends Model
{
    public function likeable(): MorphTo
    {
        return $this->morphTo();
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

这样,我们就可以使用以下的方式来获取点赞信息:

$user->likes; // 获取该用户点赞过的模型列表
$comment->likes; // 获取该评论的点赞列表
$post->likes; // 获取该文章的点赞列表

通过上述示例可以看出,使用 Laravel 的多态关系模型,我们可以轻松实现多个模型之间的共享关系,大大简化了业务逻辑实现的复杂度。