Как создать фабрику для публикации, где она также вводит данные в мета-таблицу для этой записи в laravel - PullRequest
0 голосов
/ 05 ноября 2019

использование фабрики - более чистый способ создания начальных данных. Я могу сгенерировать результат из другого метода foreach или для цикла. но как это сделать с фабрикой?

ниже находится страница пост-фабрики


<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Post;
use App\MetaData;
use Faker\Factory;

$factory->define(Post::class, function () {
    $faker = Faker\Factory::create('en_IN');
    $w = $faker->unique()->sentence.' '.mt_rand(0,1000);
    $r = [
        'title' => $w,
        'slug' => strtolower(str_replace(' ', '-', $w)),
        'banner' => 'https://source.unsplash.com/random/600x600',
        'content' => $faker->text,
        'views' => mt_rand(0,1000),
        'status' => rand(0,1),
        'creator_id' => mt_rand(0,100),
        'moderator_id' => mt_rand(0,100),
    ];

    $factory->define(MetaData::class, function () {
        return [
            'for' => 'article',
            'record_id' => $r->id,
            'title' => $w,
            'slug' => strtolower(str_replace(' ', '-', $w)),
            'description' => $faker->sentences,
            'banner' => 'https://source.unsplash.com/random/600x600',
            'keywords' => $faker->words,
            'status' => 1,
            'creator_id' => mt_rand(0,100),
            'moderator_id' => mt_rand(0,100),
        ];
    });
    return $r;
});


Я хочу сделать что-то подобное, но в итоге получится ошибка, как показано ниже:



   ErrorException  : Undefined variable: factory

  at /Users/dragonar/Dev/pdp/database/factories/PostFactory.php:23
    19|         'creator_id' => mt_rand(0,100),
    20|         'moderator_id' => mt_rand(0,100),
    21|     ];
    22| 
  > 23|     $factory->define(MetaData::class, function () {
    24|         return [
    25|             'for' => 'article',
    26|             'record_id' => $r->id,
    27|             'title' => $w,

  Exception trace:

  1   Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Undefined variable: factory", "/Users/dragonar/Dev/pdp/database/factories/PostFactory.php", [Object(Faker\Generator), "Aut voluptatum sed aut beatae. 380"])
      /Users/dragonar/Dev/pdp/database/factories/PostFactory.php:23

  2   Illuminate\Database\Eloquent\Factory::{closure}(Object(Faker\Generator), [])
      /Users/dragonar/Dev/pdp/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:273

  Please use the argument -v to see more details.

, если это решит, я также хочу добавить категории и теги к тому же сообщению.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

пожалуйста, попробуйте это

$factory->define('App\MetaData', function($faker) use ($factory) {
    // Your stuff here
});
0 голосов
/ 05 ноября 2019

Проблема в том, что вы пытаетесь определить дочерний элемент внутри фабрики родительского элемента.

Вы получаете ошибку ErrorException : Undefined variable: factory, которая говорит вам, что $factory не определено. Это потому, что вы делаете это в закрытии для фабрики постов.

Один из способов обойти это - ссылаться на пост при создании метаданных, чтобы вы не создавали их одновременновремя.

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Post;
use App\MetaData;
use Faker\Factory;

$factory->define(Post::class, function () {
    $faker = Faker\Factory::create('en_IN');
    $w = $faker->unique()->sentence.' '.mt_rand(0,1000);
    return [
        'title' => $w,
        'slug' => strtolower(str_replace(' ', '-', $w)),
        'banner' => 'https://source.unsplash.com/random/600x600',
        'content' => $faker->text,
        'views' => mt_rand(0,1000),
        'status' => rand(0,1),
        'creator_id' => mt_rand(0,100),
        'moderator_id' => mt_rand(0,100),
    ];
});

$factory->define(MetaData::class, function () {
    return [
        'for' => 'article',
        'record_id' => factory(Post::class)->id,
        'title' => $w,
        'slug' => strtolower(str_replace(' ', '-', $w)),
        'description' => $faker->sentences,
        'banner' => 'https://source.unsplash.com/random/600x600',
        'keywords' => $faker->words,
        'status' => 1,
        'creator_id' => mt_rand(0,100),
        'moderator_id' => mt_rand(0,100),
    ];
});

При этом вы сначала создаете сообщение, затем создаете метаданные и ссылаетесь на сообщение при его создании. Однако я не уверен, что это поможет вам в вашей проблеме. Поэтому вы можете создать вспомогательный класс, в котором вы можете передать некоторые переопределения для обоих классов на тот случай, если вы захотите контролировать, какие данные поступают в каждую модель.

Можно сделать так:

<?php

use App\Post;
use App\MetaData;

class FactoryHelper {
  public static function createPostWithMetaData(array $postAttributes = [], array $metaDataAttributes = [])
  {
      $post = factory(Post::class)->create(postAttributes);
      $metaData = factory(MetaData::class)->create(array_merge([
          'record_id' => $post->id
      ], $metaDataAttributes));

      return $post;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...