💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
> ## 多态一对多关联 > 描述:有书籍表、文章表、评论表三张表,书籍可以有多个评论,文章也可以有多个评论 > ### morphMany('关联模型名','多态字段信息','多态类型'); >1. 关联模型名(必须):关联的模型名称,可以使用模型名(如Comment)或者完整的命名空间模型名(如app\index\model\Comment)。 >2. 多态字段信息(可选):支持两种方式定义 如果是字符串表示多态字段的前缀(如commentable),多态字段使用 多态前缀_type和多态前缀_id,如果是数组,表示使用['多态类型字段名','多态ID字段名'],默认为当前的关联方法名作为字段前缀。 >3. 多态类型(可选):当前模型对应的多态类型,默认为当前模型名,可以使用模型名(如Article)或者完整的命名空间模型名(如app\index\model\Article) 假设表的结构如下: > ### morphTo('多态字段信息',['多态类型别名']); > 1. 多态字段信息(可选):支持两种方式定义 如果是字符串表示多态字段的前缀,多态字段使用 多态前缀_type和多态前缀_id,如果是数组,表示使用['多态类型字段名','多态ID字段名'],默认为当前的关联方法名作为字段前缀 >2. 多态类型别名(可选):数组方式定义 ``` article id - integer-文章id title - string-文章标题 content - text- 文章内容 book id - integer-书籍id title - string-书籍名称 comment id - integer-评论id content - text-评论内容 commentable_id - integer (文章|书籍)id commentable_type - string 评论的类型(文章|书籍) ``` ### 关联定义 ``` // 文章多态关联定义 class Article extends Model { /** * 获取所有针对文章的评论。 */ public function comments() { return $this->morphMany('Comment', 'commentable'); } } // 书籍多态关联定义 class Book extends Model { /** * 获取所有针对书籍的评论。 */ public function comments() { return $this->morphMany('Comment', 'commentable'); } } // 评论多态关联定义 class Comment extends Model { /** * 获取评论对应的多态模型。 */ public function commentable() { // 默认以模型名作为多态表类型(commentable_type)的划分,如Article,Book return $this->morphTo(); // 可以手动设置多态表类型名 return $this->morphTo('commentable',[ 'book' => 'app\index\model\Book', 'post' => 'app\admin\model\Article', ]); } } ``` ### 关联查找 ``` // 查找文章对应的评论 $article = Article::get(1); foreach ($article->comments as $comment) { dump($comment); } // 查找评论所属的类型(文章|书籍) $comment = Comment::get(1); $commentable = $comment->commentable; ``` > ## 多态一对一关联 > 描述:有成员表、团队表和头像表三张表,成员可以有一个头像,团队也可以有一个头像 > ### morphOne('关联模型名','多态字段信息','多态类型'); > 1. 关联模型名(必须):关联的模型名称,可以使用模型名(如Avatar)或者完整的命名空间模型名(如app\index\model\Avatar)。 >2. 多态字段信息(可选):支持两种方式定义 如果是字符串表示多态字段的前缀(如imageable),多态字段使用 多态前缀_type和多态前缀_id,如果是数组,表示使用['多态类型字段名','多态ID字段名'],默认为当前的关联方法名作为字段前缀。 >3. 多态类型(可选):当前模型对应的多态类型,默认为当前模型名,可以使用模型名(如Member)或者完整的命名空间模型名(如app\index\model\Member)。 ``` member id - integer - 成员id name - string - 成员姓名 team id - integer - 团队id name - string - 团队名称 avatar id - integer - 头像id avatar - string - 头像路径 imageable_id - integer - (成员|团队)id imageable_type - string - 头像类型(成员|团队) ``` ### 关联定义 ``` // 成员多态关联定义 class Member extends Model { /** * 获取用户的头像 */ public function avatar() { return $this->morphOne('Avatar', 'imageable'); } } // 团队多态关联定义 class Team extends Model { /** * 获取团队的头像 */ public function avatar() { return $this->morphOne('Avatar', 'imageable'); } } // 头像多态关联定义 class Avatar extends Model { /** * 获取头像对应的多态模型。 */ public function imageable() { return $this->morphTo(); } } ```