0

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

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

听起来它的设计目的是与belongsTo而不是hasMany侧面一起工作。这是我想要实现的场景:

在我的系统中,有很多项目类型,每个项目类型都有自己的发票字段布局。假设我们有一个Project模型,它有一个type字段,其值可以是contractor part-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);

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

4

1 回答 1

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_commentsposts

于 2018-07-11T08:35:47.187 回答