2

我正在使用 Laravel 8 开发一个 Web 应用程序。我注意到 Laravel 8 中发生了很多变化,包括工厂。

我的 MenuCategory 模型类有一个工厂类 MenuCategoryFactory ,其定义如下。

<?php

namespace Database\Factories;

use App\Models\Menu;
use App\Models\MenuCategory;
use Illuminate\Database\Eloquent\Factories\Factory;

class MenuCategoryFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = MenuCategory::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'menu_id' => Menu::factory()->create(),
        ];
    }
}

在我的代码(数据库播种器类)中,我试图在创建工厂时覆盖 menu_id,如下所示。

$restaurant = Restaurant::first();
        MenuCategory::factory()->create([
            'menu_id' => $restaurant->menu->id
        ]);

但它没有使用我传递的值,$restaurant->menu->id。相反,它正在创建一个新菜单。我的代码中缺少什么错误,我该如何解决?

4

2 回答 2

0

将定义更改为

public function definition()
    {
        return [
            'name' => $this->faker->name,
            'menu_id' => function() {
                 Menu::factory()->create()->id,
            }
        ];
    }

然后你可以替换值

于 2021-06-19T08:33:39.473 回答
0

在您的工厂定义中,不要调用->create(),而是像这样设置它:

public function definition()
    {
        return [
            'name' => $this->faker->name,
            'menu_id' => Menu::factory(),
        ];
    }

然后你应该能够像这样设置相关模型(假设你在模型中设置了关系):

$restaurant = Restaurant::first();
MenuCategory::factory()->for($restaurant)->create();
于 2021-11-24T23:44:39.937 回答