2021-07-05

本文介绍了数据库设计中多态关联的概念,通过案例展示了多态一对一和多态一对多的关系实现,如用户头像和团队头像的存储,以及文章和书籍评论的管理。讲解了Laravel框架中morphOne和morphMany方法的用法,以及如何在模型中定义和访问这些关联。
摘要由CSDN通过智能技术生成

多态关键:就是设置多态类型字段 前缀_type、多态关联字段 前缀_id

多态一对一 
案例:用户有一个头像、团队也是有一个头像,那么一般都是存在一个头表里面 (根据多态类型 和 多态关联字段 来查询) 
member
 id - integer
 name - string

team
 id - integer
 name - string

avatar
 id - integer
 avatar - string
 imageable_id - integer
 imageable_type - string

morphOne方法的参数如下 
morphOne('关联模型','多态字段','多态类型');

多态字段:多态前缀_id/ 多态前缀_type 一般都是填写前缀

多态类型:指定当前的模型名称(一般建议填写)

Member模型
class Member extends Model 
{ 
// 头像
    public function avatar() { 
        return $this->morphOne(Avatar::class,'imageable','Member'); 
    } 
}

team模型 
class Team extends Model 
{ 
    // 头像 
    public function avatar() {
         return $this->morphOne(Avatar::class,'Team'); 
    } 
} 

Avatar 头像模型 imageable是多态字段的前缀 一般用于多态方法名称 
class Avatar extends Model 
{
     // 多态关联方法 
    public function imageable() {
         return $this->morphTo(); 
    } 
}

Member数据表

Team数据表

Avatar头像表

多态一对多
 案例:书本和文章都有评论、那么评论是存在一张表里面。
       根据多态字段、多态类型关联 (根据多态类型 和 多态关联字段 来查询) 
文章表 
article
 id - integer
 title - string
 content - text 

书本表
book
 id - integer
 title - string 

评论表 
comment
 id - integer
 content - text
 commentable_id - integer
 commentable_type - string

morphMany('关联模型','多态字段','多态类型');

 关联模型(必须):关联的模型名称,可以使用模型名(如Comment)或者完整的命名空间模型名(如app\index\model\Comment)。

 多态字段(可选):支持两种方式定义 如果是字符串表示多态字段的前缀,多态字段使用 多态前缀_type和多态前缀_id, 如果是数组,表示使用['多态类型字段名','多态ID字段名'],默认为当前的关联方法名作为字段前缀。

 多态类型(可选):当前模型对应的多态类型,默认为当前模型名,可以使用模型名(如Article)或者完整的命名空间模型名(如app\index\model\Article)。 

文章模型 class Article extends Model { 
    // 获取文章评论 
    public function comments() { 
        return $this->morphMany(Comment::class, 'commentable','Article'); 
    } 
} 

书本模型 
class Book extends Model { 
// 获取评论 
    public function comments() { 
        return $this->morphMany(Comment::class, 'commentable','Book');
     } 
} 

morphTo('多态字段',['多态类型别名']);
 多态字段(可选):支持两种方式定义 如果是字符串表示多态字段的前缀,多态字段使用  多态前缀_type和多态前缀_id,如果是数组,表示使用['多态类型字段名','多态ID字段名'],默认为当前的关联方法名作为字段前缀

多态类型别名(可选):数组方式定义 

评论模型 
class Comment extends Model { 
/** * 获取评论对应的多态模型。 */ 
    public function commentable() { 
        return $this->morphTo(); 
    } 
}

Article 文章表

Book 书本表

Comment 评论表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值