如何用 Eloquent 建立多态关系

Posted

技术标签:

【中文标题】如何用 Eloquent 建立多态关系【英文标题】:How to establish polymorphic relations with Eloquent 【发布时间】:2020-07-24 23:21:00 【问题描述】:

使用 Laravel 和 Eloquent。我有一个如下所示的数据库:

dance_performers.dance_perfomer_type 字段包含 '\App\Dancer''\App\Couple''\App\Formation' 等值。

您将如何继续将dance_performers.dance_perfomer_id 连接到不同的型号?我不确定我应该如何在不同的模型中编写关系。 我是否应该创建一个 \App\Performer 模型,然后将其定向到前面提到的三个模型之一?

使用多态关系:

class Dance extends Model 
    public function couples() 
        return $this->morphedByMany('\App\Couple', 'dance_performer');
    


class Couple extends Model
   
    public function dances() 
        return $this->morphToMany('App\Dance', 'dance_performer');
    

目前,$dances = \App\Dance::with('couples')->get(); 仅返回空关系。 我将不胜感激。

【问题讨论】:

查看我的答案会解决你的问题 【参考方案1】:

根据您的代码,一切都是正确的。我猜你在数据库中没有正确的数据。 添加如下数据并检查。

dances

id - 1,名称 - 'Dance A'

id - 2,名称 - 'Dance B'

couples

id - 1, name - '情侣 A'

id - 2, name - '情侣 B'

dance_performers

id - 1,dance_id - 1,dance_performer_type - '\App\Couple',dance_performer_id - 1

id - 2,dance_id - 2,dance_performer_type - '\App\Couple',dance_performer_id - 2

【讨论】:

感谢您抽出宝贵时间。我再次检查了记录,它们看起来确实不错。也许值得一提的是,情侣和编队与舞者之间存在多对多的关系。我已经用我的数据库的图形表示更新了我的帖子。【参考方案2】:

解决了。 type 字段应该是 App\ModelName 而不是 \App\ModelName

【讨论】:

以上是关于如何用 Eloquent 建立多态关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 按 Eloquent 关系分组

在 Laravel 中使用 Eloquent 多态关系对数据进行分类

Laravel:Eloquent模型中的多重多态关系

如何用 phpunit 模拟 Laravel Eloquent 模型?

如何用 eloquent 在 Laravel 中只获取一个用户数据?

两个外键,如何用 laravel eloquent 映射