2021-07-05
Posted @Kerry~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-07-05相关的知识,希望对你有一定的参考价值。
多态关键:就是设置多态类型字段 前缀_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 评论表
以上是关于2021-07-05的主要内容,如果未能解决你的问题,请参考以下文章