与数据透视表的多态关系

时间:2020-07-03 15:16:26

标签: mysql laravel polymorphic-relationship

我在Laravel中定义多态关系时遇到问题。 我有一个Skill模型,该模型在其他两个模型UserClass之间共享。 因此,用户可以具有很多技能,班级可以具有很多技能,但是技能之间并不存在重叠。

所以我用skills_assoc(这是技能表的外键)创建了一个skill_id

我无法正确设置Class-> skill()函数来获取与该班级相关的技能。

skills

  • id
  • 名称

skills_assoc

  • id
  • skill_id-技能表的外键
  • skillable_id
  • skillable_type

我的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

似乎很奇怪,我的收藏集为空,无法弄清原因。

请指出我错了的地方,谢谢。

1 个答案:

答案 0 :(得分:0)

您当前使用的是错误的关系方法。

您应该在morphToManyClass上使用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');
    }
}