📅  最后修改于: 2023-12-03 15:32:34.910000             🧑  作者: Mango
在 Laravel 中,我们经常会使用到多态关系(Polymorphic Relation)这种关系形式。那么,什么是多态关系呢?
多态关系是指一个模型可以属于多个其他模型(父模型),同时一个父模型也可以拥有多个不同类型的子模型。
在实际开发中,多态关系经常用于处理一些共享关系的情况,比如文章、评论、标签等多个模型都可以被多个其他模型引用。
下面我们通过一个简单的示例来说明 Laravel 多态关系的使用。
假设我们有三个模型:User
、Post
、Comment
。现在我们需要实现以下两种关系:
为了实现这种关系,我们可以使用 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;
}
在 Post
和 Comment
模型中实现该接口:
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 的多态关系模型,我们可以轻松实现多个模型之间的共享关系,大大简化了业务逻辑实现的复杂度。