0

我在 Laravel 中定义多态关系时遇到问题。我有Skill在其他两个模型UserClass. 所以 User 可以有很多技能,Class 可以有很多技能,但是技能之间没有重叠。

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

我无法正确设置 Class -> Skills() 函数来获取与课程相关的技能。

桌子skills

  • ID
  • 姓名

桌子skills_assoc

  • ID
  • Skill_id - 技能表的外键
  • 熟练的_id
  • 技能型

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

看起来很奇怪,我的收藏是空的,不知道为什么。

当我错了,请指出,提前谢谢。

4

1 回答 1

0

您目前正在使用错误的关系方法。

您应该使用morphToManyonClassUser,和morphedByManyon Skill

文档

多对多多态关系比 morphOne 和 morphMany 关系稍微复杂一些。例如,博客帖子和视频模型可以与标签模型共享多态关系。使用多对多多态关系允许您拥有一个唯一标签列表,这些标签在博客文章和视频之间共享。首先,让我们检查一下表结构:

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

接下来,我们准备好定义模型上的关系。Post 和 Video 模型都有一个 tags 方法,它调用 Eloquent 基类的 morphToMany 方法:

class Post extends Model
{
    public function tags()
    {
        return $this->morphToMany('App\Tag', 'taggable');
    }
}

接下来,在 Tag 模型上,您应该为每个相关模型定义一个方法。所以,对于这个例子,我们将定义一个 posts 方法和一个 videos 方法:

class Tag extends Model
{
    public function posts()
    {
        return $this->morphedByMany('App\Post', 'taggable');
    }

    public function videos()
    {
        return $this->morphedByMany('App\Video', 'taggable');
    }
}
于 2020-07-06T07:17:55.650 回答