【问题标题】:Generating seed data with relationship生成具有关系的种子数据
【发布时间】:2018-09-19 15:13:10
【问题描述】:

我想为一些书籍生成种子数据,每本书都会有每个用户的评分。当我为工厂和播种机运行 db:seed 时,我没有得到想要的结果

书厂

use App\Book;
use App\Rating;
use Faker\Generator as Faker;

$factory->define(Book::class, function (Faker $faker) {
return [
    'title'     => $faker->sentence,
    'author'    => $faker->name,
    'user_id'   => 1
];
});

$factory->define(Rating::class, function (Faker $faker) {
return [
    'user_id'   => 1,
    'book_id'   => mt_rand(1, 5),
    'rating'   => mt_rand(1, 5)
];
});

BooksTableSeeder

public function run()
{
    // First remove existing books records
    Book::truncate();

    factory(App\Book::class, 5)->create()->each(function ($book) {
        // Add book rating
        $ratings = factory(App\Rating::class, 1)->make();
        $book->ratings()->saveMany($ratings);
    });
}

错误行为此代码返回一本书,其中包含来自一个用户的多个评分

正确的行为一本书应该只有一个用户评分

如何更正我的代码以实现此目标?

【问题讨论】:

    标签: php laravel laravel-5.6


    【解决方案1】:

    在生成评分时尝试设置 book_id:

        factory(App\Book::class, 5)->create()->each(function ($book) {
        // Add book rating
        $ratings = factory(App\Rating::class, 1)->create(['book_id' => $book->id]);
        $book->ratings()->saveMany($ratings);
    });
    

    【讨论】:

    • 成功了,谢谢。不过,我需要更多地使用种子数据才能完全掌握这个概念。
    • 不客气,基本上这种方式你“强制”工厂生成具有指定 book_id 的评级。
    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2019-08-31
    • 2013-03-22
    • 2013-06-27
    • 2018-06-23
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多