Мини-блог на Laravel, часть 1. Создание таблиц БД, наполнение тестовыми данными
06.09.2020
Теги: CLI • Laravel • MySQL • PHP • Web-разработка • БазаДанных • Блог • Класс • Миграции • Практика • Таблица • Фреймворк
Функционал будет минимальный — просмотр списка постов блога, просмотр отдельного поста, регистрация и авторизация, создание нового поста, редактирование или удаление ранее созданного поста. Обычные пользователи будут иметь возможность добавлять, редактировать или удалять только свои записи блога, а администратор будет иметь возможность управлять не только своими записями, но и записями всех прочих пользователей.
Подключаемся к серверу БД и создаем новую базу данных larablog
. После этого создаем первую модель Post
для работы с постами блога:
> php artisan make:model Post -m Model created successfully. Created Migration: 2020_09_06_104713_create_posts_table
При этом будет создан файл модели в директории app
и файл миграции в директории database/migrations
:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // ..... }
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->id(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } }
Для таблицы базы данных posts
добавим поля author_id
, title
, excerpt
, image
, body
. Для поля author_id
зададим ограничение внешнего ключа — это будет ссылка на поле id
таблицы users
.
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('post_id'); $table->bigInteger('author_id')->unsigned()->nullable(); $table->string('title', 100); $table->string('excerpt', 200); $table->string('image', 100)->nullable(); $table->text('body'); $table->timestamps(); // внешний ключ, ссылается на поле id таблицы users $table->foreign('author_id') ->references('id') ->on('users') ->nullOnDelete(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } }
Миграция для создания таблицы users
доступна изначально, так что нам ее создавать не нужно:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('users'); } }
Перед тем, как создавать таблицы базы данных, надо задать параметры подключения к серверу БД в файле .env
:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=larablog DB_USERNAME=root DB_PASSWORD=qwerty
Теперь все готово к миграции, создаем таблицы базы данных с помощью команды:
> php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.03 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.03 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds) Migrating: 2020_09_06_104713_create_posts_table Migrated: 2020_09_06_104713_create_posts_table (0.05 seconds)
После этого в базе данных larablog
будет пять таблиц и две из них — users
и posts
:
-- -- Структура таблицы `users` -- CREATE TABLE `users` ( `id` bigint(20) UNSIGNED NOT NULL, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `email_verified_at` timestamp NULL DEFAULT NULL, `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Индексы таблицы `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `users_email_unique` (`email`); -- -- AUTO_INCREMENT для таблицы `users` -- ALTER TABLE `users` MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
-- -- Структура таблицы `posts` -- CREATE TABLE `posts` ( `post_id` bigint(20) UNSIGNED NOT NULL, `author_id` bigint(20) UNSIGNED DEFAULT NULL, `title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, `excerpt` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL, `image` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `body` text COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- -- Индексы таблицы `posts` -- ALTER TABLE `posts` ADD PRIMARY KEY (`id`), ADD KEY `posts_author_id_foreign` (`author_id`); -- -- AUTO_INCREMENT для таблицы `posts` -- ALTER TABLE `posts` MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT; -- -- Ограничения внешнего ключа таблицы `posts` -- ALTER TABLE `posts` ADD CONSTRAINT `posts_author_id_foreign` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`);
Laravel включает в себя механизм наполнения базы данных начальными данными (seeding) с помощью специальных классов. Все такие классы хранятся в директории database/seeds
. Для создания заготовок классов UserTableSeeder
и PostTableSeeder
используем команду:
> php artisan make:seeder UserTableSeeder
> php artisan make:seeder PostTableSeeder
По умолчанию в Laravel уже определён класс DatabaseSeeder
. Из этого класса можно вызывать метод call()
для подключения других классов с данными, что позволит контролировать порядок их выполнения.
<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. * * @return void */ public function run() { $this->call(UserTableSeeder::class); $this->command->info('Таблица пользователей загружена данными!'); $this->call(PostTableSeeder::class); $this->command->info('Таблица постов блога загружена данными!'); } }
Файлы фабрик моделей хранятся в директории database/factories
, и там уже есть один готовый файл UserFactory.php
— это фабрика для модели User
. Чтобы создать фабрику для модели Post
, используем Artisan-команду:
> php artisan make:factory PostFactory --model=Post
<?php /** @var \Illuminate\Database\Eloquent\Factory $factory */ use App\Post; use Faker\Generator as Faker; $factory->define(Post::class, function (Faker $faker) { return [ 'author_id' => rand(1, 4), 'title' => $faker->realText(rand(25, 30)), 'excerpt' => $faker->realText(rand(100, 120)), 'body' => $faker->realText(rand(200, 300)), 'created_at' => $faker->dateTimeBetween('-60 days', '-30 days'), 'updated_at' => $faker->dateTimeBetween('-20 days', '-1 days'), ]; });
Осталось только отредактировать файлы классов UserTableSeeder
и PostTableSeeder
:
<?php use Illuminate\Database\Seeder; class UserTableSeeder extends Seeder { public function run() { // создать 4 пользователей сайта factory(App\User::class, 4)->create(); } }
<?php use Illuminate\Database\Seeder; class PostTableSeeder extends Seeder { public function run() { // создать 20 постов блога factory(App\Post::class, 20)->create(); } }
Заполняем таблицы базы данных начальными данными:
> php artisan migrate:fresh --seed
- Мини-блог на Laravel, часть 3. Постраничная навигация, layout-шаблон и поиск по блогу
- Мини-блог на Laravel, часть 2. Создание контроллера, представления и маршрута
- Блог на Laravel 7, часть 1. Создание таблиц БД, наполнение тестовыми данными
- Мини-блог на Laravel, часть 4. Создание нового поста, загрузка и обрезка изображения
- Блог на Laravel 7, часть 17. Временная зона для пользователей, деплой на хостинг TimeWeb
- Блог на Laravel 7, часть 16. Роль нового пользователя, сообщение админу о новом посте
- Блог на Laravel 7, часть 13. Загрузка и ресайз изображений для категорий и постов блога
Поиск: CLI • MySQL • PHP • Миграции • Практика • Фреймворк • Блог • Laravel • artisan • База данных • Таблица • Web-разработка