Для начала, давайте немного обозначим, определение модели и файлов миграции. Известно, что Laravel является веб-фреймворком, работа которого основана на концепции MVC, широко известная в программировании. Согласно этой концепции, модели выполняют роль звена, между базой данных и непосредственно логикой работы контроллера. Посредством модели мы можем взаимодействовать с базой данных в объектно-ориентированном представлении.
Что касается миграции, то они в свою очередь имеют некоторую аналогию с системами контроля версий, только главное назначение их вносить изменения в базу данных. Таким образом, когда над проектом трудится несколько разработчиков, можно вносить изменения в схему БД веб-приложения, и делиться с другими разработчиками, через Git.
Давайте приступим к примеру создания модели и миграции. Но перед этим убедитесь, что у вас создана база данных и настроена в вашем проекте Laravel.
В Laravel модель представляет из себя класс PHP, с определёнными методами. Создавать этот класс удобно через терминал, посредством консоли artisan. Если вы хорошо разбираетесь в структуре, то можно создать вручную файл, и прописать в нём необходимый класс. Мы же будем использовать консоль, т.к. этот метод более предпочтительный и быстрый.
Переходим в терминал, в папку с проектом Laravel, и выполняем команду:
php artisan make:model Contact -m
Где «Contact» — это название модели, а параметр «-m» позволит создать файл миграции. По умолчанию, файлы моделей создаются в папке /app.
Содержимое файла модели будет выглядеть следующим образом:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Contact extends Model { // }
Laravel позволяет хранить файлы моделей где угодно, по этой причине, можно завести для файлов моделей отдельную папку.
Давайте создадим папку /app/models, в которой будут храниться все модели проекта. Соответственно в эту папку необходимо будет перевести файл модели.
Старый путь: /app/Contact.php
По новому пути: /app/models/Contact.php
Кроме того, после изменения расположения файла, в коде самого файла следует поменять значение namespace. Выглядеть оно будет следующим образом:
namespace App\Models;
На этом создание файла модели завершено, теперь давайте перейдём к файлу миграции.
Файл миграции был создан в директории /database/migrations/. В этой папке будут находиться все файлы миграций, которые есть в проекте.
Пример содержимого файла миграций:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateContactsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('contacts', function (Blueprint $table) { $table->id(); $table->string('person_name'); $table->string('person_email'); $table->text('message'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('contacts'); } }
В этом файле есть два ключевых метода это up() – вызывается при запуске миграции, и down() – вызывается при отмене миграции.
Как вы можете заметить, в методе up(), посредством Schema::create() создаётся таблица «contacts» и указываются поля, которые будут созданы при миграции. В методе down() мы удаляем таблицу «contacts», посредством Schema::dropIfExists().
Запуск миграции выполняется в консоли, посредством команды:
php artisan migrate
Чтобы вернуть миграцию на один шаг назад:
php artisan migrate:rollback
Чтобы отменить миграцию на 3 шага назад:
php artisan migrate:rollback --step 3
Чтобы отменить все миграции:
php artisan migrate:reset
Процесс миграции можно отменять и по шагам, это позволяет более удобно работать со схемами таблиц при разработке.
При попытке выполнить миграцию, вы можете получить такую ошибку:
Specified key was too long error
Ситуацию можно исправить, добавив в файл:
\app\Providers\AppServiceProvider.php
Строку в начале файла:
use Illuminate\Support\Facades\Schema;
и дописать в методе boot() настройку:
public function boot() { Schema::defaultStringLength(191); }
Подобная ошибка может возникать из-за особенностей версий баз данных. Проблема появляется не всегда, поэтому нужно смотреть по ситуации. Так же рекомендую материал по теме миграции:
https://laravel.com/docs/8.x/migrations