【发布时间】:2021-03-02 15:55:48
【问题描述】:
对于我的测试 (Laravel 6),我尝试使用带有 make() 的工厂,以便绕过数据库操作,只需创建模型的新实例。
现在,我很难让我的一对多关系正常工作。
我的代码框架只是为了有一个概述:
class Fine extends Model {
// Other things here
public function articles()
{
return $this->hasMany('App\Model\Article');
}
}
其中Article 没有任何其他关系。
现在,我想创建一个 Fine factory 来创建一个实例,我可以在其中解析 $fine->articles,所有这些都无需任何数据库交互。
这是可以工作的基本 Fine 工厂(不使用文章):
$factory->define(Fine::class, function (Faker $faker) {
返回 [
"id" => 10,
很好::FIELDONE => 'xxx',
很好::FIELDTWO => 'yyy',
];
});
我与 $fine = factory(Fine::class)->make(); 一起使用。
现在我需要“预填”文章。我曾尝试使用 hydrate(),但它不起作用。
我已经尝试使用 afterMaking() 使用不同的代码组合:
$factory->afterMaking(Fine::class, function (Fine $fine, Faker $faker) {
$articles = factory(\App\Model\Article::class, 3)->make([\App\Model\Article::FINE_ID => $fine->id]);
// TEST WITH SAVEMANY: $fine->saveMany(factory(\App\Model\Article::class, 10)->make());
// SAME WITH CREATEMANY
// TEST WITH HYDRATE: $multa->articles()->hydrate([$article]);
// $multa->load('articles');
});
为了说明一点,我尝试了不同的道路,但我承认,我有点迷茫。
基本上我会选择古典的
Illuminate\Database\QueryException: SQLSTATE[42S02]: 未找到基表或视图
错误,所以我还在访问数据库。
现在,我开始认为只有在最终将数据存储在数据库中时,工厂才是正确的选择(我确信 saveMany() 会在我使用 create() 而不是make())。
您能告诉我如何完成这项任务吗?如果工厂不是正确的做法,我也愿意改变我的选择。
提前致谢! 洛伦佐
【问题讨论】:
-
saveMany()将仅适用于create()就像您说的那样,因为它会尝试将它们保存到数据库中。您能否提供更多信息,您如何在代码和测试中使用这种关系?如果您将虚假记录预填充到关系中,则在您的代码中执行$fine->articles()的任何地方都将访问数据库。如果您尝试从$fine->articles这样的属性中获取文章,那没关系,但这是只读的,您不能这样设置。 -
嗨,感谢您的评论以澄清 saveMany() / create() 的东西!基本上我在精细模型中有一个自定义的
toArray()方法,它执行foreach $this->articles,所以恐怕我不能在我的测试中“绕过数据库”,毕竟(?)。