Laravel多态有很多关系

时间:2018-07-11 07:18:28

标签: laravel eloquent has-many-polymorphs

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

  

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

听起来像belongsTo,而不是hasMany。这是我要实现的方案:

在我的系统中,项目类型很多,每种项目类型都有自己的发票字段布局。假设我们有一个Project模型,其中有一个type字段,其值可以是contractpart-time。我们还有另外两个称为ContractInvoicePartTimeInvoice的表来定义它们各自的字段布局,这两个发票表都有一个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);

我觉得必须有更好的方法来做到这一点。有人可以说明一下吗?

1 个答案:

答案 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属性和单独的发票表正在定义它们之间的刚性关系,这与多态性的概念背道而驰。将likescomments视为posts