【问题标题】:polymorph relations with pivot table与数据透视表的多态关系
【发布时间】:2020-07-03 15:16:26
【问题描述】:

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

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

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

skills

  • 身份证
  • 姓名

skills_assoc

  • 身份证
  • skill_id - 技能表的外键
  • skillable_id
  • skillable_type

我的Classskills() 定义是

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

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

有错误的地方请指出,先谢谢了。

【问题讨论】:

  • 您应该在ClassUser 上使用morphToMany 来检索技能,并在Skill 上使用morphedByMany 来获取反向关系,您可以阅读更多关于它的信息here .
  • 谢谢@Remul,您的解决方案完美运行,不知道为什么我以前没有看到它。但无论如何,我很感激你的正确答案。
  • 如果您想接受,我添加了评论作为答案。如果您可以编辑我的答案并添加您的关系方法现在的外观,那就太好了。

标签: mysql laravel polymorphic-relationship


【解决方案1】:

你目前使用了错误的关系方法。

您应该在ClassUser 上使用morphToMany,在Skill 上使用morphedByMany

来自docs

多对多多态关系比多对多关系稍微复杂一些 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

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

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

接下来,在标签模型上,你应该为它的每一个定义一个方法 相关模型。所以,对于这个例子,我们将定义一个 posts 方法 和视频方法:

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

    public function videos()
    {
        return $this->morphedByMany('App\Video', 'taggable');
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2021-09-05
    • 2017-07-22
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多