Laravel 7: Как использовать в массиве сидера данных - PullRequest
0 голосов
/ 21 июня 2020

Как сделать отдельные вставки с помощью настраиваемого массива с помощью сеялки базы данных?

Используя следующий код:

$categories = ['Hardware', 'Software', 'Planning', 'Tools'];
        foreach ($categories as $category) {
            App\Category::insert([
                'name' => $category,
                'slug' => Str::slug($category),
            ]);
        }

Это не работает без фабрики для категории, которая является проблема, если я использую insert или create.

Это дает эту ошибку

Unable to locate factory for [App\Category].

  at vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php:273
    269|      */
    270|     protected function getRawAttributes(array $attributes = [])
    271|     {
    272|         if (! isset($this->definitions[$this->class])) {
  > 273|             throw new InvalidArgumentException("Unable to locate factory for [{$this->class}].");
    274|         }
    275| 
    276|         $definition = call_user_func(
    277|             $this->definitions[$this->class],

Спасибо

Ответы [ 2 ]

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

Создайте массив данных в методе запуска вашего файла-сидера.

public function run()
{
    $categories = [
        ['name' => 'Music'],
        ['name' => 'Gaming'],
        ['name' => 'Entertainment'],
        ['name' => 'Non-Profit & Activism'],
        ['name' => 'Other'],
    ];
    foreach ($categories as $category) {
        Category::create($category);
    }
}

Вы помещаете все данные в модель, поэтому вам нужно установить в модели заполняемые или охраняемые.

class Category extends Model
{
      protected $guarded = [];
}
0 голосов
/ 21 июня 2020

попробуйте использовать insert , чтобы взять массив в качестве параметра:

public function run()
    {
        $inputs[] = ['name'=> 'Hardware'];
        $inputs[] = ['name'=> 'Software'];
        $inputs[] = ['name'=> 'Planning'];
        $inputs[] = ['name'=> 'Tools'];

        App\Category::insert($inputs);
       
    }

или вы можете сделать это другим способом:

  public function run()
    {
     $inputsNames = ['Hardware', 'Software', 'Planning', 'Tools'];
     foreach($inputsNames  as $categoryName)
       {
          $inputs[]=['name'=>$categoryName];
       }    
      App\Category::insert($inputs);   
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...