【问题标题】:How to create a factory for post where it also enters data in meta table for that post in laravel如何为帖子创建一个工厂,它还在 laravel 中为该帖子的元表输入数据
【发布时间】:2020-03-01 18:25:16
【问题描述】:

使用工厂是创建种子数据的一种更简洁的方法。 我可以从另一种 foreach 或 for 循环方法生成结果。但是工厂怎么做呢?

下面是后期工厂页面


<?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.

如果这解决了,我还想在同一个帖子中添加类别和标签。

【问题讨论】:

    标签: php laravel factory record faker


    【解决方案1】:

    请试试这个

    $factory->define('App\MetaData', function($faker) use ($factory) {
        // Your stuff here
    });
    

    【讨论】:

    • 我赞成它,因为它比我提供的答案更明显地解决了这个问题。
    【解决方案2】:

    这里的问题是您试图在父级的工厂中定义子级。

    您收到ErrorException : Undefined variable: factory 错误,告诉您$factory 未定义。这是因为你是在 post 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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 2021-09-21
      • 2014-08-30
      • 2020-10-20
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 2015-11-07
      • 2016-03-12
      相关资源
      最近更新 更多