Мини-блог на Laravel, часть 1. Создание таблиц БД, наполнение тестовыми данными

06.09.2020

Теги: CLILaravelMySQLPHPWeb-разработкаБазаДанныхБлогКлассМиграцииПрактикаТаблицаФреймворк

Функционал будет минимальный — просмотр списка постов блога, просмотр отдельного поста, регистрация и авторизация, создание нового поста, редактирование или удаление ранее созданного поста. Обычные пользователи будут иметь возможность добавлять, редактировать или удалять только свои записи блога, а администратор будет иметь возможность управлять не только своими записями, но и записями всех прочих пользователей.

Подключаемся к серверу БД и создаем новую базу данных 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

Поиск: CLI • MySQL • PHP • Миграции • Практика • Фреймворк • Блог • Laravel • artisan • База данных • Таблица • Web-разработка

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.