我有一个posts
的工厂和一个posts_images
的工厂,一个帖子可以包含很多图像,我确实为看起来像这样的帖子创建了种子。
$posts = factory(App\Models\Post::class, 100)->create()
->each(function($post) {
$post->images()->saveMany(factory(App\Models\PostsImage::class, 3)->make());
});
我想创建100 posts
,并且每个帖子都有3 images
,这种工作是问题,当图像被创建时
我希望从base_64字符串创建图像并将其保存在特定目录中,但是我需要id
中的post
,以便可以在其中创建图像的文件夹。
$factory->define(App\Models\PostsImage::class, function (Faker $faker) {
//this does not get me the id
$id = factory(\App\Models\Post::class)->make()->id;
$name = time();
$b64_image = \Config::get('constants.seed_image');
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $b64_image));
if(!file_exists(public_path('images/eventos/'.$id.'/'))) {
mkdir(public_path('images/noticias/'.$id.'/'));
}
file_put_contents(public_path('images/noticias/'.$id.'/'.$name.'.jpg'), $data);
return [
//
'image' => $name,
'order' => $id + 1
];
});
唯一似乎无效的行是
$id = factory(\App\Models\Post::class)->make()->id;
我确实尝试使用create
而不是make
,但这会在post
表中创建更多行,而我不希望这样做。
是否可以将post
id
传递到图像工厂?
答案 0 :(得分:0)
最好的选择是在posts
播种器中创建目录,因为在创建$post
时您可以访问Post
对象。尝试这样的事情:
$posts = factory(App\Models\Post::class, 100)->create()
->each(function($post) {
//id is available on the $post object created
$id = $post->id;
$name = time();
$b64_image = \Config::get('constants.seed_image');
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $b64_image));
if(!file_exists(public_path('images/eventos/'.$id.'/'))) {
mkdir(public_path('images/noticias/'.$id.'/'));
}
file_put_contents(public_path('images/noticias/'.$id.'/'.$name.'.jpg'), $data);
$post->images()->saveMany(factory(App\Models\PostsImage::class, 3)->make());
});
答案 1 :(得分:0)
在这种情况下,我通常要做的是获取所创建父对象的最后一条记录。
$factory->define(App\Models\PostsImage::class, function (Faker $faker) {
// get last record of Post
$id = \App\Models\Post::orderBy('id', 'desc')->first()->id;
$name = time();
$b64_image = \Config::get('constants.seed_image');
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $b64_image));
if(!file_exists(public_path('images/eventos/'.$id.'/'))) {
mkdir(public_path('images/noticias/'.$id.'/'));
}
file_put_contents(public_path('images/noticias/'.$id.'/'.$name.'.jpg'), $data);
return [
//
'image' => $name,
'order' => $id + 1
];
});