Передать родительский идентификатор фабрике отношений? - PullRequest
0 голосов
/ 28 октября 2018

У меня есть фабрика 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 к фабрике изображений?

1 Ответ

0 голосов
/ 28 октября 2018

Наилучшим вариантом будет создание каталога в сеялке 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());
});
...