将父母ID传递给关系工厂?

时间:2018-10-27 21:38:17

标签: php laravel eloquent factory

我有一个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传递到图像工厂?

2 个答案:

答案 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
    ];
});