Может войдёшь?
Черновики Написать статью Профиль

Загрузка начальных данных в БД

перевод документация 5.х

  1. 1. Введение
  2. 2. Создание начальных данных
    1. 2.1. Использование фабрик моделей
    2. 2.2. Вызов дополнительной загрузки начальных данных
  3. 3. Запуск загрузки начальных данных
Этот перевод актуален для англоязычной документации на (ветка 5.3) , (ветка 5.2) и (ветка 5.1). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

У Laravel есть простой механизм наполнения вашей БД начальными данными (seeding) с помощью специальных классов. Все такие классы хранятся в каталоге database/seeds. Они могут иметь любое имя, но вам, вероятно, следует придерживаться какой-то логики в их именовании — например, UserTableSeeder и т.д. По умолчанию для вас уже определён класс DatabaseSeeder. Из этого класса вы можете вызывать метод PHPcall() для подключения других классов с данными, что позволит вам контролировать порядок их выполнения.

Создание начальных данных

Для добавления данных в БД используйте Artisan-команду shmake:seeder. Все начальные данные, сгенерированные фреймворком, будут помещены в папке database/seeds (для версии 5.1 — database/seeders):

shphp artisan make:seeder UsersTableSeeder

Класс начальных данных содержит в себе только один метод по умолчанию — PHPrun(). Этот метод вызывается, когда выполняется Artisan-команда shdb:seed. В методе PHPrun() вы можете вставить любые данные в БД. Вы можете использовать конструктор запросов, чтобы вручную вставить данные. Также можно воспользоваться фабриками Eloquent моделей.

В качестве примера давайте модифицируем стандартный класс DatabaseSeeder и добавим оператор вставки в БД в метод PHPrun():

PHP
<?php

use Illuminate\Database\Seeder;
use 
Illuminate\Database\Eloquent\Model;

class 
DatabaseSeeder extends Seeder
{
 
/**
  * Загрузка начальных данных.
  *
  * @return void
  */
  
public function run()
  {
    
DB::table('users')->insert([
      
'name' => str_random(10),
      
'email' => str_random(10).'@gmail.com',
      
'password' => bcrypt('secret'),
    ]);
  }
}

Использование фабрик моделей

Конечно, ручное определение признаков для каждой модели начальных данных затруднительно. Вместо этого вы можете использовать фабрики моделей для быстрой генерации больших объёмов данных. Во-первых, пересмотрите документацию по фабрике моделей, чтобы изучить, как определяются фабрики. Как только вы определите свои фабрики, вы можете использовать вспомогательную функцию PHPfactory(), чтобы вставлять записи в вашу базу данных.

Например, давайте создадим 50 пользователей и привяжем отношения к каждому из них:

PHP
/**
 * Загрузка начальных данных.
 *
 * @return void
 */
public function run()
{
  
factory(App\User::class, 50)->create()->each(function ($u) {
    
$u->posts()->save(factory(App\Post::class)->make());
  });
}

Вызов дополнительной загрузки начальных данных

В классе DatabaseSeeder вы можете использовать метод PHPcall(), чтобы запустить дополнительные классы загрузки. Использование метода PHPcall() позволяет вам разбить свою загрузку начальных данных на несколько файлов, чтобы ни один отдельный класс загрузки не разрастался. Просто передайте название класса загрузки, который вы хотите выполнить:

PHP
/**
 * Загрузка начальных данных.
 *
 * @return void
 */
public function run()
{
  
//для версии 5.1:
  //Model::unguard();

  
$this->call(UsersTableSeeder::class);
  
$this->call(PostsTableSeeder::class);
  
$this->call(CommentsTableSeeder::class);

  
//для версии 5.1:
  //Model::reguard();
}

Запуск загрузки начальных данных

Как только вы написали свои классы загрузки, вы можете использовать Artisan-команду shdb:seed для запуска загрузки. По умолчанию команда shdb:seed вызывает класс DatabaseSeeder, который может быть использован для вызова других классов, заполняющих БД данными. Однако, вы можете использовать параметр sh--class для указания конкретного класса для вызова:

shphp artisan db:seed

php artisan db:seed --class=UsersTableSeeder
//для версии 5.1:
//php artisan db:seed --class=UserTableSeeder

Вы также можете использовать для заполнения БД данными команду shmigrate:refresh, которая также откатит и заново применит все ваши миграции:

shphp artisan migrate:refresh --seed

Комментарии (2)

WarLight

Нашел, что то, что представлено здесь в конце (команды) не работают. Долго мучался)
А на этой странице всё ок.

Вместо

shphp artisan db:seed —class=UserTableSeeder

должно быть

shphp artisan db:seed --class=UserTableSeeder

Предположу, что и

shphp artisan migrate:refresh —seed

нужно поправить

blackdark20

Ссылка ... документацию по фабрике моделей, ... не работает

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.