根据Laravel的文档,模型的多态性定义如下:
多态关系允许一个模型在单个关联上属于一个以上的模型
听起来像belongsTo
,而不是hasMany
。这是我要实现的方案:
在我的系统中,项目类型很多,每种项目类型都有自己的发票字段布局。假设我们有一个Project
模型,其中有一个type
字段,其值可以是contract
或part-time
。我们还有另外两个称为ContractInvoice
和PartTimeInvoice
的表来定义它们各自的字段布局,这两个发票表都有一个project_id
引用项目记录。我想做的是我想要一个通用接口来检索给定项目的所有发票,例如$project->invoices
。
当前解决方案
我不知道如何通过多态来实现这一目标。因此,我目前正在做的事情很愚蠢,在switch
模型类的invoice()
方法中使用Project
语句:
switch ($this->type) {
case 'contract':
$model = 'App\ContractInvoice';
break;
case 'part-time':
$model = 'App\PartTimeInvoice';
break;
}
return $this->hasMany($model);
我觉得必须有更好的方法来做到这一点。有人可以说明一下吗?
答案 0 :(得分:0)
在这种情况下,我看不出多态关系会带来什么好处。如果您有不同的项目类型模型和单个发票表,则发票可以转换为项目。但是正如您所描述的,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);
});
}
type
模型上的Project
属性和单独的发票表正在定义它们之间的刚性关系,这与多态性的概念背道而驰。将likes
和comments
视为posts
。