【问题标题】:Laravel 8.x, make fake model reationships?Laravel 8.x,制作假模型关系?
【发布时间】:2021-01-04 15:51:48
【问题描述】:

我正在尝试为关系运行一个伪造的工厂,但该字段始终返回 NULL。如何在不访问数据库的情况下伪造模型关系?

我有一个与父事件表一对一关系的 Map 工厂。我需要伪造这种关系以进行单元测试:

/**
 * Define the model's default state.
 *
 * @return array
 */
public function definition()
{
    return [
        'event' => 'faker.' . join('_', $this->faker->words),
        'category' => $this->faker->word,
        'sub_category' => $this->faker->word,
        'priority' => $this->faker->randomElement(['normal', 'high']),
        'event' => Event::factory()->makeOne(),
    ];
}

这会从调试器返回一个假模型,但 event 为空:

result = {array} [5]
 event = "faker.eum_voluptatibus_aut"
 category = "libero"
 sub_category = "aut"
 priority = "high"
 event = null

我尝试使用状态,但同样的事情发生了:

public function disabled()
{
    return $this->state([
        'event' => Event::factory()->makeOne(['enabled' => false]),
    ]);
}

对象返回一个空的event 值。我需要一个可以横向进入的伪造对象:if ($object->event->enabled) [...]。如何生成虚假的模型关系?

【问题讨论】:

  • 我怀疑这个问题源于对工厂运作方式的误解;您的数组不应该有 event 键,因为这是关系的名称。相反,它应该使用数据库列的名称,即event_id,当然不能包含随机文本,因为它是一个数字列。

标签: php laravel laravel-8


【解决方案1】:

如果您使用的是 Laravel 8.x,则必须考虑使用文档中使用的方法,它必须如下所示:

/**
 * Define the model's default state.
 *
 * @return array
 */
public function definition()
{
    return [
        'event' => 'faker.' . join('_', $this->faker->words),
        'category' => $this->faker->word,
        'sub_category' => $this->faker->word,
        'priority' => $this->faker->randomElement(['normal', 'high']),
        'event_id' => Event::factory(),
    ];
}

/**
 * Indicate that the map is disabled.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function disabled()
{
    return $this->state([
        'event_id' => Event::factory()->create(['enabled' => false]),
    ]);
}

【讨论】:

    【解决方案2】:

    到目前为止,我发现的唯一解决方案是在我的测试中自己手动设置 event 键。这不是理想或优雅的解决方案。

    $fieldMap = Map::factory()->makeOne();
    $fieldMap->event = Event::factory(['enabled' => false])->makeOne();
    

    我不喜欢这种方法。为什么我不能在工厂中定义工厂?

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2015-08-06
      • 2021-11-18
      • 2019-04-04
      • 2019-03-25
      • 2016-05-01
      • 2023-01-12
      相关资源
      最近更新 更多