Автоматическое наполнение БД в Laravel

Добавлено: 27/08/2016 01:52 |  Обновлено: 04/09/2016 00:17 |  Добавил: nick |  Просмотры: 8406 Комментарии: 0
Вводная часть
В этом материале я опишу, как в Laravel можно удобно заполнить БД случайными данными, используя для этого artisan, tinker, model factories и faker.
Для начала установим копию Laravel на нужный сервер, как это делается можно почитать и посмотреть на разных сайтах, в том числе и на англоязычном сайте разработчиков, в разделе документации. Кстати, они там добавили два туториала по созданию to-do списка, один попроще, другой посложнее. Раньше этого не было, и была только одна документация. Я думаю, что они сделали правильно, что добавили эти два примера законченных приложений. Потому что когда в первый раз сталкиваешься с фреймворком, и тем более с достаточно многофункциональным, таким как Laravel, трудно сразу понять, как же это все вместе работает. Если вы не очень хорошо знаете английский, то перевод документации и материалов по созданию to-do списка можно найти на русскоязычных сайтах.

Пока набирал этот материал, Laravel обновили до версии 5.3 и обучающие материалы по созданию to-do списка из документации для этой версии убрали, поэтому, если что смотрите их для версии 5.2.

После того как вы установили папку с проектом нужно подкорректировать файл .env, который находится в корне. Для отработки материала из этой статьи нужно лишь настроить соединение с БД (тип БД, имя БД, пользователь, пароль). Я использую MySql.

Далее, нам нужно создать таблицы в БД. Делается это с помощью файлов миграций. В этих файлах вы описываете структуру будущих таблиц, после чего по одной команде в консоли Laravel за вас создает эти таблицы. Плюс этих файлов в том, что если вам потребуется многократно создавать таблицы, вам останется только каждый раз набирать одну команду. Это удобно, но удобство на этом не заканчивается. Вот, для примера, участок кода из файла миграции:
Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
Думаю, тут наглядно понятно, из каких столбцов ваша таблица будет состоять. Файлы миграций находятся в папке (database → migrations). Подробнее, о том, как создаются файлы миграций можно почитать в документации. По умолчанию, в папке migrations уже есть два файла: create_users_table.php и create_password_resets_table.php. В этом материале я буду использовать первый из них. Создавать дополнительных файлов миграций нам сегодня не потребуется.

Итак, чтобы создать таблицу из файла миграции нужно в командной строке набрать команду:
php artisan migrate
В результате выполнения этой команды будет показано следующее:
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table 
Это значит, что таблицы в БД созданы.

После этого таблицы нужно наполнить содержимым. Первый способ – это seeding. Находите файл DatabaseSeeder.php (database → seeds), указываете данные, которыми вы хотите наполнить таблицы и в консоли пишете следующую команду:
php artisan db:seed
После чего таблицы будут заполнены нужными вам данными. Можно добавить свои данные или использовать faker. Подробнее читайте в документации.

Но материал этот посвящен не сидингу и миграциям, а тому, что появилось в версии 5.1 – это factories. Эти самые factories или фабрики можно найти в папке database → factories. Естественно, например, в четвертой версии фреймворка этой папки не было. Кстати, разработчики основательно перетряхнули папку app. Например, те же миграции и сидинги находились в папке database, которая в свою очередь находилась в папке app. Теперь папку database вынесли из папки app в корневую папку проекта. Папка controllers перекочевала в папку Http (внутри папки app). Папку models вообще убрали. И много чего еще в папке app появилось нового. После четвертой версии приходится привыкать к новой структуре папок. Но наглядно видно, что фреймворк не стоит на месте, а активно равивается.

Вернемся к фабрикам. Напоминаю, что фабрики можно найти в папке database → factories. Там вы найдете файл ModelFactory.php. По умолчанию в этом файле следующее содержимое:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->safeEmail,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
    ];
});
Здесь мы можем определить какие столбцы таблицы, и какими данными нужно заполнять.

Возвращаемся в командную строку. Создадим вручную, например, 5 пользователей. Строки таблицы для каждого пользователя будут заполнены случайными данными (так как это определено в фале ModelFactory.php). Для этого используем tinker.

Введем такую команду:
php artisan tinker
Затем, должны появиться строки:
Psy Shell v0.7.2 (PHP 7.0.8 — cli) by Justin Hileman
>>>
Теперь можно создать табличные записи всего лишь одной строчкой:
factory(App\User::class, 5)->create();
В результате выполнения команды в консоли вы увидите результат:
=> Illuminate\Database\Eloquent\Collection {#644
     all: [
       App\User {#648
         name: "Louvenia Jaskolski",
         email: "elvera.grimes@example.org",
         updated_at: "2016-08-23 11:19:18",
         created_at: "2016-08-23 11:19:18",
         id: 1,
       },
       App\User {#647
         name: "Jan Dooley",
         email: "johns.nicholaus@example.com",
         updated_at: "2016-08-23 11:19:18",
         created_at: "2016-08-23 11:19:18",
         id: 2,
       },
       App\User {#646
         name: "Prof. Caterina Walsh",
         email: "swift.joy@example.com",
         updated_at: "2016-08-23 11:19:18",
         created_at: "2016-08-23 11:19:18",
         id: 3,
       },
       App\User {#645
         name: "Maybell Collier",
         email: "kris.grady@example.com",
         updated_at: "2016-08-23 11:19:18",
         created_at: "2016-08-23 11:19:18",
         id: 4,
       },
       App\User {#652
         name: "Mr. Xavier Koch III",
         email: "browe@example.org",
         updated_at: "2016-08-23 11:19:18",
         created_at: "2016-08-23 11:19:18",
         id: 5,
       },
     ],
   }
В таблицу пользователей внесено 5 записей.

Если вам затем потребуется вывести список всех пользователей из таблицы, используйте команду:
App\User::all();
Для вывода общего количества пользователей (записей) используйте команду:
App\User::count();
Для вывода определенного пользователя (в данном случае с id, равным единице) можно воспользоваться следующей конструкцией:
App\User::where('id', 1)->first();
Для удаления этого же пользователя используйте следующие команды:
$user = App\User::where('id', 1)->first();
$user->delete();
Мы можем также создать нового пользователя прямо из консоли:
$user = new App\User;
$user->name = "Anton Antonov";
$user->email = "anton@mail.com";
$user->save();
Вернемся к файлу ModelFactory.php. Напоминаю, что его содержимое по умолчанию следующее:
$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->safeEmail,
        'password' => bcrypt(str_random(10)),
        'remember_token' => str_random(10),
    ];
});
Если вы, например, хотите создать посты для блога, то можно добавить в этот файл еще такой код:

$factory->define(App\Post::class, function (Faker\Generator $faker) {
    return [
        'title' => $faker->sentence,
        'body' => $faker->paragraph,
    ];
});

Оставьте свой комментарий

Комментариев нет