Laravel多态性有许多关系

Laravel多态性有许多关系,laravel,eloquent,has-many-polymorphs,Laravel,Eloquent,Has Many Polymorphs,根据Laravel的文档,模型多态性定义如下: 多态关系允许一个模型在单个关联上属于多个其他模型 听起来它的设计目的是使用belongsTo而不是有许多方面。下面是我想要实现的一个场景: 在我的系统中,有许多项目类型,每个项目类型都有自己的发票字段布局。假设我们有一个项目模型,它有一个类型字段,其值可以是合同或兼职。我们还有另外两个名为contracinvoice和PartTimeInvoice的表来定义各自的字段布局,这两个发票表都有一个引用项目记录的project\u id。我想做的是我想要

根据Laravel的文档,模型多态性定义如下:

多态关系允许一个模型在单个关联上属于多个其他模型

听起来它的设计目的是使用
belongsTo
而不是
有许多方面。下面是我想要实现的一个场景:

在我的系统中,有许多项目类型,每个项目类型都有自己的发票字段布局。假设我们有一个
项目
模型,它有一个
类型
字段,其值可以是
合同
兼职
。我们还有另外两个名为
contracinvoice
PartTimeInvoice
的表来定义各自的字段布局,这两个发票表都有一个引用项目记录的
project\u id
。我想做的是我想要一个通用接口来检索给定项目的所有发票,类似于
$project->invoices

当前解决方案

我不知道如何通过多态性实现这一点。所以我现在做的有点傻,在
invoice()
方法的
Project
model类中使用
switch
语句:

switch ($this->type) {
    case 'contract':
        $model = 'App\ContractInvoice';
        break;
    case 'part-time':
        $model = 'App\PartTimeInvoice';
        break;
}

return $this->hasMany($model);

我觉得一定有更好的办法。有人能解释一下吗?

我不认为多态关系在这种情况下会有什么好处。如果您有不同的项目类型模型和单个发票表,那么发票可能会随项目而变化。但正如您所描述的,switch语句听起来似乎已经足够了。当
条件如下时,可以使用
实现相同的方法:

public function invoices()
{
    return $this->when($this->type === 'contract', function () {
        return $this->hasMany(ContractInvoice::class);
    })->when($this->type === 'part-time', function () {
        return $this->hasMany(PartTimeInvoice::class);
    });
}

项目
模型上的
类型
属性和单独的发票表定义了它们之间的严格关系,这与多态性的思想背道而驰。思考
喜欢
评论
帖子

是的,我同意。我所设计的似乎是多态性的反模式。我决定创建一个ProjectType表,并将type作为项目表上的外键。在ProjectType表中,我定义了一个名为invoiceModel的属性。因此,我可以只做
return$this->hasMany($this->type->invoiceModel),而不用fluent-when-api或繁琐的开关或if-else块。我认为这是我所需要的最好的方法。