【问题标题】:Laravel 7: Create a custom factory for categoryLaravel 7:为类别创建自定义工厂
【发布时间】:2020-10-10 21:13:17
【问题描述】:

我试图让以下类别工厂工作。

类别工厂

<?php

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

use App\Category;
use Illuminate\Support\Str;
use Faker\Generator as Faker;

$categories = ['category', 'category-2', 'category-3']

$factory->define(Category::class, function (Faker $faker) {
    return [
        'name' => // I can't use a foreach here
        'slug' => Str::slug($category),
    ];
});

我该如何实现?

我需要我的类别是独一无二的

使用来自@omr 的最新更新进行更新

分类工厂

use App\Category;
use Illuminate\Support\Str;
use Faker\Generator as Faker;

$categories = ['Hardware', 'Software', 'Planning', 'Tools'];

foreach ($categories as $categoryName) {
    factory(Category::class)->create([
        'name' => $categoryName,
        'slug' => Str::slug($categoryName),
    ]);
}

数据库播种器



public function run()
    {
        factory('App\Category', 20)->create();
        
    }

 ErrorException 

  require(/home/dan/Codes/laravel/jobportal/database/factories/CategoryFactory.php): failed to open stream: Too many open files

  at vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factory.php:220
    216|         $factory = $this;
    217| 
    218|         if (is_dir($path)) {
    219|             foreach (Finder::create()->files()->name('*.php')->in($path) as $file) {
  > 220|                 require $file->getRealPath();
    221|             }
    222|         }
    223| 
    224|         return $factory;
 

谢谢

【问题讨论】:

    标签: laravel laravel-factory


    【解决方案1】:

    您可以使用 $faker->numberBetween 从 $categories 数组中获取随机元素,然后在工厂中使用它:

    $categories = ['category', 'category-2', 'category-3'];
    
    $factory->define(Category::class, function (Faker $faker)use($categories) {
        $categoryName= $categories[$faker->numberBetween(0,count($categories)-1)];
        return [
            'name' =>$categoryName,
            'slug' => Str::slug($categoryName),
        ];
    });
    

    编辑:

    如果您想生成唯一的类别名称

    第一:标准类工厂:

    $factory->define(Category::class, function (Faker $faker){
    
        return [
            'name' =>$faker->name,
            'slug' =>  Str::slug($faker->text(12))
        ];
    });
    

    只要通过自己的工厂字段,就不用担心类别名称和slug兼容性....

    秒:

    现在,当您创建类别时,您可以传递所需的属性,如下所示:

    在数据库播种器中:

    use use Faker\Generator;
    

    ....... .......

    $counter=0;
    while($counter<20)
    {
    $categoryName=$faker->text(12);
    if(Category::firstWhere('name',$categoryName)==null)
    {
    $counter+=1;
    factory(Category::class)->create(['name'=>$categoryName,'slug'=>Str::slug($categoryName)]);
    }
    }
    

    不要直接使用 factory('App\Category', 20)->create();没有参数它不能帮助你...

    【讨论】:

    • 我不需要随机元素,我只想在类别表中植入不同的类别。你能告诉我怎么做吗,因为我尝试了所有我能想到的也尝试了unique,但没有继续下去。
    【解决方案2】:

    您需要database seeder.

    您的类别工厂将在下面有代码

    $factory->define(Category::class, function (Faker $faker) {
        return [
            'name' => 'Name',
            'slug' => 'name',
        ];
    });
    

    您的数据库播种器将拥有:

    $categories = ['Category', 'Category 2', 'Category 3'];
    
    foreach($categories as $category) {
      factory(App\Category::class)->create([
        'name' => $category,
        'slug' => \Str::slug($category)
      ]);
    }
    

    现在运行:php artisan db:seed(注意:这将为所有其他播种机播种,更好地使用:--class=YOUR_SEED_CLASS

    【讨论】:

    • 您的答案将生成不同的类别,但也会将名称作为字符串添加到数据库中。请检查您的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2021-03-18
    相关资源
    最近更新 更多