Для начала, давайте немного обозначим, определение модели и файлов миграции. Известно, что 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