2

大家我有关于 Laravel模型工厂的问题,我有以下工厂定义。

$factory->define(Video::class, function (Faker\Generator $faker) {
    return [
        "title"         => $faker->unique()->text,
        "description"   => $faker->text(),
        "created_at"    => $faker->dateTimeThisYear
    ];
});

基本上,该模型与内容表和资源belongsTo表有两种关系,并定义为content_idresource_id列。

所以我希望这个播种机创建内容、资源,然后在创建之前将它们附加到视频模型。

    factory(Video::class, 50)->create()->each(function($item) {
        /** @var $item Video */
        $item->content()->associate(factory(Content::class)->create());
        $item->resource()->associate(factory(Resource::class)->create());
    });

但是,这不起作用,并且我收到有关videos表上 content_id 外键的错误。我在这里做错了什么?任何帮助是极大的赞赏 :)

4

2 回答 2

2

我会这样做:为模型创建工厂并从新工厂引用它们

$factory->define('App\Content', function(Faker\Generator $faker) {
    return [
        'body' => $faker->paragraph
    ];
});

$factory->define('App\Resource', function(Faker\Generator $faker) {
    return [

    ];
});

$factory->define('App\Video', function (Faker\Generator $faker) {
    return [
        "title"         => $faker->unique()->text,
        "content_id" => function() {
            return factory('App\Content')->create()->id;
        },
        "resource_id" => function() {
            return factory('App\Resource')->create()->id;
        },
        "description"   => $faker->text(),
        "created_at"    => $faker->dateTimeThisYear
    ];
});

我假设您的 Video 类在 App 下命名空间。如果您的类没有命名空间,则可以删除 App 命名空间。

于 2017-08-03T08:20:47.293 回答
1

您还可以分配相应的内容和资源 id factory('App\Content')->create(),并laravel自动为您分配适当的 id。例子:

"resource_id" => factory('App\Content')->create(),
于 2019-09-09T17:31:01.683 回答