Laravel多态性具有多种关系



从Laravel的文档中,模型多态性定义如下:

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

听起来它是为使用belongsTo而不是hasMany而设计的。以下是我想要实现的场景:

在我的系统中,有很多项目类型,每个项目类型都有自己的发票字段布局。假设我们有一个具有type字段的Project模型,其值可以是contractpart-time。我们有另外两个名为ContractInvoicePartTimeInvoice的表来定义它们各自的字段布局,这两个发票表都有一个引用项目记录的project_id。我想做的是,我想要一个通用接口来检索给定项目的所有发票,比如$project->invoices

当前解决方案

我不知道如何通过多态性来实现这一点。因此,我目前所做的有点傻,在Project模型类上的invoice()方法中使用switch语句

switch ($this->type) {
case 'contract':
$model = 'AppContractInvoice';
break;
case 'part-time':
$model = 'AppPartTimeInvoice';
break;
}
return $this->hasMany($model);

我觉得一定有更好的方法。有人能放些光吗?

我看不出多态关系在这种情况下会有什么好处。如果您有不同的项目类型模型和一个发票表,那么发票可能会变形为项目。但正如您所描述的,switch语句听起来就足够了。使用when条件语句(如:(可以实现相同的方法

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);
});
}

Project模型上的type属性和单独的发票表定义了它们之间的刚性关系,这违背了多态性的思想。将likes看作commentsposts

最新更新