【问题标题】:Laravel Model factories, one to many relationship without database accessLaravel 模型工厂,无需数据库访问的一对多关系
【发布时间】: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,所以恐怕我不能在我的测试中“绕过数据库”,毕竟(?)。

标签: laravel eloquent


【解决方案1】:

如果确实需要,您可以在不存在的模型实例上设置此信息:

$fine->setRelation(
    'articles', 
    factory(\App\Model\Article::class, 3)->make()
)

这取决于您打算如何使用此模型及其关系,因为没有设置 ID,因此它们并没有真正相关。

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2014-07-01
    • 1970-01-01
    • 2017-08-07
    • 2020-07-08
    相关资源
    最近更新 更多