База данных: загрузка начальных данных
11.x
.
Почему это важно?
Введение
У Laravel есть простой механизм наполнения вашей БД начальными данными с помощью специальных классов. Все такие классы хранятся в директории database/seeds
. Они могут иметь любое имя, но вам, вероятно, следует придерживаться какой-то логики в их именовании — например, UsersTableSeeder
, и т.д. По умолчанию для вас уже определён класс DatabaseSeeder
. Из этого класса вы можете вызывать метод call
для подключения других классов с данными, что позволит вам контролировать порядок их выполнения.
Создание начальных данных
Для добавления данных в БД используйте Artisan-команду make:seeder
. Все начальные данные, сгенерированные фреймворком, будут помещены в директорию database/seeds
:
php artisan make:seeder UsersTableSeeder
Класс начальных данных по умолчанию содержит в себе только один метод: run
. Этот метод вызывается, когда выполняется Artisan-команда db:seed
. В методе run
вы можете вставить любые данные в БД. Можно использовать конструктор запросов , чтобы вручную вставить данные. Также можно воспользоваться фабриками моделей Eloquent.
В качестве примера давайте модифицируем стандартный класс DatabaseSeeder
и добавим оператор вставки в БД в метод run
:
<?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'),
]);
}
}
Использование фабрик моделей
Конечно, ручное определение признаков для каждой модели начальных данных – довольно сложный процесс. Вместо этого вы можете использовать фабрики моделей для быстрой генерации больших объёмов данных. Во-первых, пересмотрите документацию по фабрикам моделей , чтобы изучить, как определяются фабрики. Как только вы определите свои фабрики, вы можете использовать хелпер factory
, чтобы вставлять записи в вашу базу данных.
Например, давайте создадим 50 пользователей и привяжем отношения к каждому пользователю:
/**
* Загрузка начальных данных.
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create()->each(function ($u) {
$u->posts()->save(factory(App\Post::class)->make());
});
}
Вызов дополнительной загрузки начальных данных
В классе DatabaseSeeder
вы можете использовать метод call
, чтобы запустить дополнительные классы загрузки. Использование метода call
позволяет вам разбить свою загрузку начальных данных на несколько файлов, чтобы ни один отдельный класс загрузки не разрастался. Просто передайте название класса загрузки, который вы хотите выполнить:
/**
* Загрузка начальных данных.
*
* @return void
*/
public function run()
{
$this->call(UsersTableSeeder::class);
$this->call(PostsTableSeeder::class);
$this->call(CommentsTableSeeder::class);
}
Запуск загрузки начальных данных
Как только вы написали свои классы загрузки, вы можете использовать Artisan-команду db:seed
для запуска загрузки. По умолчанию команда db:seed
вызывает класс DatabaseSeeder
, который может быть использован для вызова других классов, заполняющих БД данными. Однако, вы можете использовать параметр --class
для указания конкретного класса для вызова:
php artisan db:seed
php artisan db:seed --class=UsersTableSeeder
Вы также можете использовать для заполнения БД данными команду migrate:refresh
, которая также откатит и заново применит все ваши миграции:
php artisan migrate:refresh --seed