我在Laravel中定义多态关系时遇到问题。
我有一个Skill
模型,该模型在其他两个模型User
和Class
之间共享。
因此,用户可以具有很多技能,班级可以具有很多技能,但是技能之间并不存在重叠。
所以我用skills_assoc
(这是技能表的外键)创建了一个skill_id
表
我无法正确设置Class-> skill()函数来获取与该班级相关的技能。
表skills
表skills_assoc
我的Class
技能()定义是
return $this
->morphedByMany(Skill::class, 'skillable', 'skills_assoc', 'skill_id', 'skill_id', 'skill_id');
问题是,当我想获得$class->skills
时
并打印查询
$class->skills()->toSql()
我收到这个奇怪的查询
select * from `skills`
inner join `skills_assoc` on `skills`.`id` = `skills_assoc`.`skill_id`
where `skills_assoc`.`skill_id` is null and `skills_assoc`.`skillable_type` = ?
where `skills_assoc`.`skill_id` is null
似乎很奇怪,我的收藏集为空,无法弄清原因。
请指出我错了的地方,谢谢。
答案 0 :(得分:0)
您当前使用的是错误的关系方法。
您应该在morphToMany
和Class
上使用User
,在morphedByMany
上使用Skill
。
来自docs:
多对多态关系比 morphOne和morphMany关系。例如,博客帖子和 视频模型可以与Tag模型共享多态关系。用一个 多对多多态关系使您可以拥有一个 在博客文章和视频之间共享的唯一标签。首先,让我们检查表结构:
posts
id - integer
name - string
videos
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
接下来,我们准备在模型上定义关系。邮政 和视频模型都将具有标签方法,该方法会调用 Eloquent基类上的morphToMany方法:
class Post extends Model
{
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
接下来,在Tag模型上,您应该为其每个方法定义一个方法 相关模型。因此,在此示例中,我们将定义一个posts方法 和视频方法:
class Tag extends Model
{
public function posts()
{
return $this->morphedByMany('App\Post', 'taggable');
}
public function videos()
{
return $this->morphedByMany('App\Video', 'taggable');
}
}