所以我在使用工厂在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'];
拉拉威尔魔法会照顾剩下的。希望这会有所帮助。