Laravel 7: создать собственную фабрику для категории - PullRequest
0 голосов
/ 20 июня 2020

Я пытался заставить работать следующую фабрику категорий.

Фабрика категорий

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

Спасибо

Ответы [ 2 ]

1 голос
/ 20 июня 2020

вы можете использовать $ faker-> numberBetween, чтобы получить случайный элемент из массива $ категорий, а затем использовать его внутри фабрики:

$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),
    ];
});

edit:

, если вы хотите сгенерировать уникальный имена категорий

first: стандартная фабрика категорий:

$factory->define(Category::class, function (Faker $faker){

    return [
        'name' =>$faker->name,
        'slug' =>  Str::slug($faker->text(12))
    ];
});

до тех пор, пока вы сами передаете заводские поля, нет необходимости беспокоиться о совместимости имени категории и слагов ....

секунда:

теперь, когда вы создаете свои категории, вы передаете нужные атрибуты, например:

в сеялке базы данных:

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 (); без параметра он вам не поможет ...

1 голос
/ 20 июня 2020

Вам понадобится сеялка базы данных.

Завод вашей категории будет иметь код ниже

$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)

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