每个人对Laravel Model Factories 都有疑问,我有以下工厂定义。
$factory->define(Video::class, function (Faker\Generator $faker) {
return [
"title" => $faker->unique()->text,
"description" => $faker->text(),
"created_at" => $faker->dateTimeThisYear
];
});
此模型基本上与内容和资源表有两个belongsTo
关系,并定义为 content_id 和 resource_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外键的错误。我在这做错了什么?非常感谢任何帮助:)
答案 0 :(得分:1)
我会这样做:为模型创建工厂并从新工厂引用它们
$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 namespacce。
答案 1 :(得分:1)
您还可以分配相应的内容和资源ID factory('App\Content')->create()
,laravel
会自动为您分配适当的ID。
示例:
"resource_id" => factory('App\Content')->create(),