2. Создание БД. Миграции

30 Мая 2020 22:55 (Редактировано: 03 Июня 2020 22:57)

Миграции БД в Laravel позволяют простым способом определить структуру таблицы базы данных и выполнять модификации с использованием простого и выразительного PHP кода.

Ссылка на страницу в документации - Laravel Миграции.

Требования к серверу Базы данных

  • MySQL/MariaDB 5.6+
  • PostgreSQL 9.4+
  • SQLite 3.8.8+
  • SQL Server 2017+

Создание Базы данных

CREATE SCHEMA `database` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

Прописываем в .env файле данные для подключения.

Создаем миграции

Laravel имеет свой интерфейс командной строки под названием Artisan. Миграции создаются с помощью этого интерфейса. Пишем в командную строку:

php artisan make:model Models/BlogCategory -m
php artisan make:model Models/BlogPost -m

Таким образом, будут созданы миграции и помещены в директорию migrations. Также будет создана директория models и в нее помещены свежесозданные модели BlogCategory.php и BlogPost.php.

В файле миграции присутствует два основных метода: up и down. Up - накатывает изменения в таблицу БД, Down - Откатывает, если нужно довнести изменения.

Также, интересный момент - При создании миграции BlogCategory, laravel автоматически создает название для таблицы через нижнее подчеркивание blog_category

Теперь можно запустить команду миграции и создадутся соответствующие таблицы в базе данных.

php artisan migrate

Могут возникнуть проблемы при осуществлении миграций, если используется сервер баз даных Maria DB. Для решения вопроса необходимо в файл \app\Providers\AppServiceProvider.php добавить в начало файла

use Illuminate\Support\Facades\Schema;

а также это: 

public function boot()
{
    \Schema::defaultStringLength(191);
}

В документации это описано. 

Создание структуры таблиц

По умолчанию, в laravel уже присутствует модель User.php - ее можно перенести во вновьсозданную директорию models т.к. User.php, все таки, относится к моделям. И необходимо не забыть подправить пространство имен у этой модели, пишем - namespace App\Models;

В laravel "из коробки" идет структура для вновьсозданных таблиц: id, created_at, updated_at и чуть по более набор полей для users. Создание этих полей прописано в файлах миграций в методе up, например, чтобы создать набор полей для дат используется вызов метода $table->timestamps(). Точно также метод $table->softDeletes(); создаст поле deleted_at

Поэтому, чтобы создать необходимые нам поля, можно дропнуть базу, создать ее заново и произвести миграции уже после наполнения метода up у моделей BlogCategories и BlogPosts следующим содержимым: 

BlogCategories

public function up()
{
    Schema::create('blog_categories', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('parent_id')->unsigned()->default(1);

        $table->string('slug')->unique();
        $table->string('title');
        $table->text('description')->nullable();

        $table->timestamps();
        $table->softDeletes();
    });
}

BlogPosts

public function up()
{
    Schema::create('blog_posts', function (Blueprint $table) {
        $table->increments('id');

        $table->integer('category_id')->unsigned();
        $table->bigInteger('user_id')->unsigned();

        $table->string('slug')->unique();
        $table->string('title');

        $table->text('excerpt')->nullable();

        $table->text('content_raw');
        $table->text('content_html');

        $table->boolean('is_published')->default(false);
        $table->timestamp('published_at')->nullable();

        $table->timestamps();
        $table->softDeletes();

        //Привязка этой таблицы к другим таблицам - users и blog_categories по определенным полям.
        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('category_id')->references('id')->on('blog_categories');

        $table->index('is_published');
    });
}

Далее снова выполняем миграцию

php artisan migrate

На этом этапе будут созданы все указанные таблицы со всеми необходимыми полями.