如何在用值替换枚举的laravel模型中刷新值


How to refresh values in laravel models where enums are replaced with values?

所以我在使用工厂在laravel中编写测试时遇到了一个奇怪的问题。所以这是我写的一个测试:

/**
 @test
 */
public function document_belongs_to_a_patent()
{
    $patent = factory(Patent::class)->create();
    $document = factory(Document::class)->create([
        'documentable_id' => $patent->id,
        'documentable_type' => 'patent'
    ]);
    $this->assertArraySubset($patent->toArray(), $document->documentable->toArray());
}

所以这应该有效,因为两者应该返回相同的东西,并且patent数组应该相等或是documentable数组的子集。但当我意识到Patent模型中有一个枚举字段,我将值1传递给它,但它在数据库中被转换为枚举等效值,当我尝试document->documentable->toArray()时,它返回的是枚举值而不是1,这让我思考如何使模型工厂返回实际的枚举值,而不是索引号。

我刚刚通过工厂获得了专利,就像这样:

$patent = Patent::find($patent->id);

它运行良好,但似乎不一致。有没有办法刷新模型。我知道我们可以刷新模型之间的关系,但有没有办法为模型本身做这件事?

如果您严格需要对API进行更改,您可以对这样的突变进行大胆的操作。

https://laravel.com/docs/5.1/eloquent-serialization

添加此属性。它告诉Laravel,仅用于特殊输出,它需要附加一个非数据库属性。

protected $appends = ['documentable_type_name'];

然后你需要一些方法来了解枚举的语言。你需要一个数组,一个@lang定义,等等。这里有一个受保护的属性解决方案,我在简单的情况下非常喜欢。

protected static $documentable_types = [ 'divorce', 'patent' ];

然后在Documentable模型上创建这个变异函数。

public function getDocumentableTypeName()
{
    if ($this->documentable_type)
    {
        return static::$documentable_types[ $this->documentable_type ];
    }
    return null;
}

这会将JSON输出更改为如下所示:

{
    docuemntable_id        : 555,
    documentable_type      : 1,
    documentable_type_name : 'patent'
}

您也可以通过添加此项来隐藏document_type字段。

protected $hidden  = ['documentable_type'];

拉拉威尔魔法会照顾剩下的。希望这会有所帮助。