Введение
У 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
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 пользователей и привяжем отношения к каждому из них:
/**
* Загрузка начальных данных.
*
* @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()
позволяет вам разбить свою загрузку начальных данных на несколько файлов, чтобы ни один отдельный класс загрузки не разрастался. Просто передайте название класса загрузки, который вы хотите выполнить:
/**
* Загрузка начальных данных.
*
* @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)
Нашел, что то, что представлено здесь в конце (команды) не работают. Долго мучался)
А на этой странице всё ок.
Вместо
должно быть
Предположу, что и
нужно поправить
Ссылка ... документацию по фабрике моделей, ... не работает