多态关联应用场景是当多个表同时有一个字段需求时设定的,比如:
video 视频表 :视频文件,视频评论
essay 文章表:文章内容,文章评论
这俩个表都有评论这个字段,为了更好的查数据,多态关联可以更好的处理数据
数据表结构#
多态关联允许一个模型在单个关联上属于多个其他模型。例如,想象一下使用您应用的用户可以「评论」文章和视频。使用多态关联,您可以用一个 comments 表同时满足这两个使用场景。让我们来看看构建这种关联所需的数据表结构:
posts id-integer title-string body-textvideos id-integer title-string url-stringcomments id-integer body-text commentable_id-integer commentable_type-string
comments 表中有两个需要注意的重要字段 commentable_id 和 commentable_type。commentable_id 用来保存文章或者视频的 ID 值,而 commentable_type 用来保存所属模型的类名。commentable_type 是在我们访问 commentable 关联时, 让 ORM 确定所属的模型是哪个「类型」。
模型结构#
接下来,我们来看看创建这种关联所需的模型定义:
* 获得拥有此评论的模型。
*/publicfunctioncommentable(){return$this->morphTo();}}classPostextendsModel{/**
* 获得此文章的所有评论。
*/publicfunctioncomments(){return$this->morphMany('App\Comment','commentable');}}classVideoextendsModel{/**
* 获得此视频的所有评论。
*/publicfunctioncomments(){return$this->morphMany('App\Comment','commentable');}}
获取多态关联#
一旦您的数据库表准备好、模型定义完成后,就可以通过模型来访问关联了。例如,我们只要简单地使用 comments动态属性,就可以获得某篇文章下的所有评论:
$post=App\Post::find(1);foreach($post->commentsas$comment){ //}
插入多态关联数据
$post=App\Post::find(1)->create(['comment'=>'要插入的数据']);