Сиды и фабрики. Тестовые данные (Урок 3)

Настало время заполнить наши созданные таблицы тестовыми данными, для этого в Laravel существуют сиды или как правильно их называть seeding.

Классы для работы с этими сидами располагаются по адресу: database\seeds. Откройте в этой папке файл DatabaseSeeder.php

В этом файле мы будем прописывать запуск всех наших сидов и фабрик о которых мы поговорим чуть позже.

Отредактируем этот файл раскоментировав строчку $this->call(UsersTableSeeder::class); если у вас этой строчки нет, добавьте ее в метод run

Теперь создадим наши первый сиды, вот такими командами:

php artisan make:seeder UsersTableSeeder
php artisan make:seeder BlogCategoriesTableSeeder

Откройте файл database\seeds\UsersTableSeeder.php и вставьте в него следующий код:

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
		$data = [];
		
		$data [] = [
			'name'=>'Админ',
			'email'=>'admin@testmailg.ru',
			'password'=>bcrypt('qwerty1234'),
		];
		
		for($i = 2; $i<=5; $i++){
			$data [] = [
				'name'=>'Пользователь '.$i,
				'email'=>'ueser'.$i.'@testmailg.ru',
				'password'=>bcrypt(str_random(16)),
			];
		}
       
		
		DB::table('users')->insert($data);
    }
}

Таким образом, когда мы запустим сиды у нас появится 5 пользователей, у одного мы будем знать пароль это qwerty1234 и под ним мы будем авторизовываться у других это будет случайный пароль.

Теперь добавим код в файл database\seeds\BlogCategoriesTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class BlogCategoriesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $categories = [];
		
		$cName = "Без категории";
		
		$categories[] = [
			'title' => $cName,
			'slug' => str_slug($cName),
			'parent_id' => 0
		];
		
		for($i = 1; $i<=15; $i++){
			
			$cName = "Категория №".$i;
			$parent_id = ($i>7) ? rand(1,7) : 1;
			
			$categories[] = [
				'title' => $cName,
				'slug' => str_slug($cName),
				'parent_id' => $parent_id
			];
		}
		
		\DB::table('blog_categories')->insert($categories);
    }
}

Тут мы делаем первую категорию, на которую можно будет ссылаться, а потом запускаем цикл и создаем 15 категорий, при этом как вы наверное догадались из кода то когда счетчик в нашем цикле перевалит за 7, то id родительской категории будет ставиться случайным образом от 1 до 7.

Добавьте в файл database\seeds\DatabaseSeeder.php в метод run() строчку $this->call(BlogCategoriesTableSeeder::class);

Прежде чем запустить сиды, создадим фабрику для наполнения нашей таблицы с постами блога.

Фабрики очень удобны для генерации больших объемов информации. Откройте папку database\factories и создайте файл BlogPostFactory.php со следующим кодом:

<?php

use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\Models\BlogPost::class, function (Faker $faker) {
    $title = $faker->sentence(rand(3,8), true);
	$txt = $faker->realText(rand(1000,3000));
	$isPublished = rand(1,5) > 1;
	
	$createdAt = $faker->dateTimeBetween('-3 months','-2 months');
	
	$data = [
		'category_id' => rand(1,16),
		'user_id' => 1,
		'title' => $title,
		'slug' => str_slug($title),
		'excerpt' => $faker->text(rand(40,100)),
		'content_raw' => $txt,
		'content_html' => $txt,
		'is_published' => $isPublished,
		'published_at' => $isPublished ? $faker->dateTimeBetween('-2 months','-1 days'):null,
		'created_at' => $createdAt,
		'updated_at' => $createdAt,
	];
	
	return $data;
});

Расскажу подробнее о том, что тут происходит. В столбец category_id мы пишем случайный id нашей категории. В столбец user_id, мы поставили единицу, таким образом все посты у нас созданны тем пользователем, от которого у нас есть пароль.

В столбец excerpt мы добавляем случайный текст от 40 до 100 символов.

В столбец content_raw и content_html мы добавялем реальный текст от 1000 до 3000 символов.

Столбец is_published обычно будет в значении 1 и иногда будет встречаться 0 и в зависимости от этого столбец published_at будет заполнен датой от двух месяцев назад до одного дня назад или же будет null в том случае, если пост еще не опубликован.

Столбцы created_at и updated_at будут заполнены датой от 3 до 2 месяцев назад.

У ларавеля есть много своих функций и некоторые из них могут помочь вам для задания значений полей в вашей фабрике. Информацию по этим функциям лучше всего искать в документации ларавеля.

Теперь у нас практически все готово для запуска сидов, осталось прописать в database\seeds\DatabaseSeeder.php нашу фабрику с постами, добавив следующую строчку factory(\App\Models\BlogPost::class, 150)->create(); в метод run. В результате файл DatabaseSeeder.php будет иметь такой вид:

<php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UsersTableSeeder::class);
		$this->call(BlogCategoriesTableSeeder::class);
		factory(\App\Models\BlogPost::class, 150)->create();
    }
}

Обратите внимание, что мы указали количество наших постов 150 штук. Теперь запустим наши сиды командой:

php artisan db:seed

У вас должна появится надпись Seeding: UsersTableSeeder Seeding: BlogCategoriesTableSeeder и надпись Database seeding completed succesfully.

Зайдите в вашу базу данных и посмотрите, какие тестовые данные появились в таблице users, blog_categories и blog_posts.

В следующем уроке мы поговорим о маршрутизации и выведем посты нашего блога на страницу.

Комменатрии
Добавить комментарий