Verification: a143cc29221c9be0

Php artisan migrate не работает

Php artisan migrate не работает

Предварительные требования

Для работы с этим руководством сделайте следующее:

  1. установите Git;
  2. PHP 5.6.4 или более поздней версии;
  3. Composer;
  4. Включите следующие расширения PHP, необходимые для Laravel: OpenSSL, PDO-MySQL, Mbstring, Tokenizer и XML.
  5. MySQL (этот компонент потребуется запустить).

Подготовка локальной базы данных MySQL

На этом шаге вы создадите базу данных на локальном сервере MySQL для использования в этом руководстве.

Подключение к локальному серверу MySQL

В окне терминала подключитесь к локальному серверу MySQL. Используйте это окно терминала для выполнения всех команд в рамках этого руководства.

mysql -u root -p

Если появится предложение ввести пароль, введите пароль для учетной записи root. Если вы не помните пароль учетной записи привилегированного пользователя, ознакомьтесь с разделом MySQL: How to Reset the Root Password (MySQL: как сбросить пароль привилегированного пользователя).

Если команда выполнена успешно, значит, сервер MySQL работает. В противном случае обеспечьте запуск локального сервера MySQL, выполнив соответствующие действия после установки MySQL.

Локальное создание базы данных

В командной строке mysql создайте базу данных.

CREATE DATABASE sampledb;

Завершите подключение к серверу, введя команду quit.

quit

Локальное создание приложения PHP

На этом шаге вы создадите пример приложения Laravel, настроите его подключение к базе данных и запустите это приложение в локальной среде.

Клонирования репозитория

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

git clone https://github.com/Azure-Samples/laravel-tasks

С помощью команды cd перейдите в клонированный каталог. Установите необходимые пакеты.

cd laravel-tasks
composer install

Настройка подключения к MySQL

В корне репозитория создайте файл .env. Скопируйте в файл .env приведенные ниже переменные. Замените заполнитель паролем привилегированного пользователя MySQL.

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=

Сведения о том, как Laravel использует файл .env, см. в разделе Environment Configuration (Конфигурация среды).

Локальный запуск примера

Выполните перенос базы данных Laravel, чтобы создать таблицы, необходимые для приложения. Чтобы узнать, какие таблицы создаются при переносе, просмотрите каталог database/migrations в этом репозитории Git.

php artisan migrate

Создайте ключ приложения Laravel.

php artisan key:generate

Запустите приложение.

php artisan serve

Откройте браузер и перейдите по адресу http://localhost:8000. Добавьте несколько задач на странице.

Приложение PHP успешно подключается к базе данных MySQL

Чтобы остановить приложение PHP, введите Ctrl + C в окне терминала.

Создание гибкого сервера MySQL (предварительная версия).

На этом шаге вы создадите базу данных MySQL в режиме развертывания База данных Azure для MySQL (Гибкий сервер), который предоставляется в общедоступной предварительной версии. Позже вы настроите приложение PHP для подключения к этой базе данных. Запустите Azure Cloud Shell и создайте сервер, выполнив команду az flexible-server create.

az mysql flexible-server create  --resource-group myResourceGroup --public-access 

Важно!

  • Запишите значения имени сервера и строки подключения, чтобы применить их на следующем шаге для подключения к Laravel и запуска переноса данных.
  • Для аргумента IP-Address укажите IP-адрес клиентского компьютера. Созданный сервер сразу блокируется, и для локального управления этим сервером необходимо разрешить доступ клиентскому компьютеру.

Настройка брандмауэра сервера для подключения веб-приложения к серверу

В Cloud Shell создайте правило брандмауэра для сервера MySQL, чтобы разрешить подключения клиентов, выполнив команду az mysql server firewall-rule create. Если для начального и конечного IP-адресов задано значение 0.0.0.0, брандмауэр открывается только для тех служб Azure, которые не используют статические IP-адреса для подключения к серверу.

az mysql flexible-server firewall-rule create --name allanyAzureIPs --server  --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

Локальное подключение к серверу рабочей базы данных MySQL

В окне терминала на локальном компьютере подключитесь к серверу MySQL в Azure. Используйте значение, указанное ранее для и . При появлении запроса на ввод пароля используйте пароль, указанный во время создания базы данных в Azure.

mysql -u  -h .mysql.database.azure.com -P 3306 -p

Создание рабочей базы данных

В командной строке mysql создайте базу данных.

CREATE DATABASE sampledb;

Создание пользователя с разрешениями

Создайте пользователя базы данных с именем phpappuser и предоставьте ему все привилегии в базе данных sampledb. Для простоты в этом руководстве используется пароль MySQLAzure2020.

CREATE USER 'phpappuser' IDENTIFIED BY 'MySQLAzure2020';
GRANT ALL PRIVILEGES ON sampledb.* TO 'phpappuser';

Завершите подключение к серверу, введя команду quit.

quit

Подключение приложения к гибкому серверу MySQL

На этом шаге вы подключите приложение PHP к базе данных MySQL, созданной в Базе данных Azure для MySQL.

Настройка подключения к базе данных

В корневой папке репозитория создайте файл .env.production и скопируйте в него следующие переменные. Замените заполнитель в значениях DB_HOST и DB_USERNAME.

APP_ENV=production
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=.mysql.database.azure.com
DB_DATABASE=sampledb
DB_USERNAME=phpappuser
DB_PASSWORD=MySQLAzure2017
MYSQL_SSL=true

Сохраните изменения.

Совет

Чтобы защитить сведения о подключении к MySQL, этот файл извлекается из репозитория Git (см. файл .gitignore в корне репозитория). Позже вы узнаете, как настроить переменные среды в службе приложений для подключения к базе данных в Базе данных Azure для MySQL. Благодаря этим переменным вам не нужен файл .env в службе приложений.

Настройка TLS/SSL-сертификата

По умолчанию гибкий сервер MySQL требует, чтобы клиенты использовали подключения по протоколу TLS. Чтобы подключиться к базе данных MySQL в Azure, вам потребуется сертификат с расширением PEM, предоставленный службой "База данных Azure для MySQL (Гибкий сервер)". Скачайте этот сертификат и поместите его в папку SSL в локальной копии репозитория с примером приложения.

Откройте файл config/database.php и добавьте в connections.mysql параметры sslmode и options, как показано в следующем коде.

'mysql' => [
    ...
    'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL') && extension_loaded('pdo_mysql')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/DigiCertGlobalRootCA.crt.pem',
    ] : []
],

Локальное тестирование приложения

Выполните перенос базы данных Laravel с помощью файла .env.production, указав его как файл среды, чтобы создать таблицы в базе данных MySQL, размещенной в Базе данных Azure для MySQL. Помните, что файл .env.production содержит сведения о подключении к базе данных MySQL в Azure.

php artisan migrate --env=production --force

Файл .env.production еще не содержит действительный ключ приложения. Создайте для него новый ключ в окне терминала.

php artisan key:generate --env=production --force

Запустите пример приложения, указав файл .env.production как файл среды.

php artisan serve --env=production

Перейдите на страницу http://localhost:8000. Если страница загрузилась без ошибок, значит, приложение PHP подключается к базе данных MySQL в Azure.

Добавьте несколько задач на странице.

Подключение приложения PHP к Базе данных Azure для MySQL

Чтобы остановить приложение PHP, введите Ctrl + C в окне терминала.

Фиксация изменений

Чтобы зафиксировать изменения, выполните следующие команды Git:

git add .
git commit -m "database.php updates"

Ваше приложение готово к развертыванию.

Развертывание в Azure

На этом шаге вы развернете приложение PHP, подключенное к базе данных MySQL, в службе приложений Azure.

Настойка пользователя развертывания

Для развертывания в веб-приложение Azure из FTP и локального репозитория Git можно использовать пользователя развертывания. Настроив один раз пользователя развертывания, вы сможете использовать его для всех последующих развертываний в Azure. Имя пользователя и пароль учетной записи развертывания отличаются от учетных данных подписки Azure.

Чтобы настроить пользователя развертывания, выполните в Azure Cloud Shell команду az webapp deployment user set. Вместо и укажите имя пользователя и пароль для вашего развертывания.

Имя пользователя должно быть уникальным в Azure. Кроме того, чтобы отправка в локальный репозиторий Git работала, имя пользователя не должно содержать символ @. Пароль должен содержать не менее восьми символов и включать два из трех следующих элементов: буквы, цифры и символы.

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux

В выходных данных JSON пароль отображается как NULL. Если вы видите сообщение "Conflict. Сведения. Ошибка 409", измените имя пользователя. Если вы видите сообщение об ошибке "Bad Request. Сведения. Ошибка 400", используйте более надежный пароль. Запишите имя пользователя и пароль и используйте их для развертывания веб-приложений.

Создание плана службы приложений

В Cloud Shell создайте план службы приложений в группе ресурсов, выполнив команду az appservice plan create. В следующем примере создается план Службы приложений с именем myAppServicePlan в ценовой категории "Бесплатный" (--sku F1) в контейнере Linux (--is-linux).

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku F1 --is-linux

Создание веб-приложения

Создайте веб-приложение в плане Службы приложений myAppServicePlan.

В Cloud Shell для этого можно использовать команду az webapp create. В следующем примере замените глобальным уникальным именем приложения (допустимые символы: a-z, 0-9 и -). Для среды выполнения установлено значение PHP|7.0. Чтобы просмотреть все поддерживаемые среды выполнения, выполните команду az webapp list-runtimes --linux.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name  --runtime "PHP|7.3" --deployment-local-git

Когда веб-приложение будет создано, в Azure CLI отобразится примерно следующее:

Local git is configured with url of 'https://@.scm.azurewebsites.net/.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": ".azurewebsites.net",
  "deploymentLocalGitUrl": "https://@.scm.azurewebsites.net/.git",
  "enabled": true,
  
}

Вы создали пустое веб-приложение с включенным развертыванием Git.

Примечание

URL-адрес удаленного репозитория Git отображается в свойстве deploymentLocalGitUrl в таком формате: https://@.scm.azurewebsites.net/.git. Сохраните этот URL-адрес для дальнейшего использования.

Настройка параметров базы данных

В службе приложений переменные среды задаются в качестве параметров приложения с помощью команды az webapp config appsettings set.

Команда ниже позволяет настроить параметры приложения DB_HOST, DB_DATABASE, DB_USERNAME и DB_PASSWORD. Замените заполнители и .

az webapp config appsettings set --name  --resource-group myResourceGroup --settings DB_HOST=".mysql.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="phpappuser" DB_PASSWORD="MySQLAzure2017" MYSQL_SSL="true"

Для доступа к параметрам можно использовать метод PHP getenv. В коде Laravel используется программа-оболочка env для PHP getenv. Например, конфигурация MySQL в файле config/database.php выглядит следующим образом:

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    ...
],

Настройка переменных среды Laravel

В среде Laravel требуется ключ приложения из службы приложений. Его можно настроить с помощью параметров приложения.

В окне терминала на локальном компьютере используйте php artisan для создания ключа приложения без сохранения в файле .env.

php artisan key:generate --show

В Cloud Shell задайте ключ приложения в приложении Службы приложений с помощью команды az webapp config appsettings set. Замените заполнители и .

az webapp config appsettings set --name  --resource-group myResourceGroup --settings APP_KEY="" APP_DEBUG="true"

Значение APP_DEBUG="true" указывает Laravel возвращать отладочную информацию в случае ошибок в работе развернутого приложения. При выполнении рабочего приложения задайте для него более безопасное значение false.

Задание пути виртуального приложения

Жизненный цикл приложения Laravel начинается в общем каталоге, а не в корневом каталоге приложения. Образ PHP Docker по умолчанию для службы приложений использует Apache и не позволяет настраивать DocumentRoot для Laravel. Тем не менее вы можете использовать .htaccess для повторного создания всех запросов к точке в каталоге /public вместо корневого каталога. В корне репозитория для этой цели уже добавлен .htaccess. С ним приложение Laravel будет готово к развертыванию.

См. подробнее об изменении корневого каталога сайта.

Публикация в Azure из Git

Вернитесь к окну терминала (в локальном расположении) и добавьте удаленное приложение Azure в локальный репозиторий Git. Замените URL-адресом удаленного репозитория Git, который вы сохранили при создании веб-приложения.

git remote add azure 

Отправьте код в удаленное приложение Azure, чтобы развернуть приложение. При появлении запроса на ввод учетных данных в диспетчере учетных данных Git введите учетные данные, созданные на шаге настройки пользователя развертывания (а не те, которые используются для входа на портал Azure).

git push azure main

Выполнение этой команды может занять несколько минут. При выполнении эта команда выводит приблизительно следующие сведения:

Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'a5e076db9c'.
remote: Running custom deployment command...
remote: Running deployment command...
...

Переход к приложению Azure

Перейдите по адресу http://.azurewebsites.net и добавьте несколько задач в список.

Веб-приложение PHP в Azure

Вы запустили управляемое данными приложение PHP в службе приложений Azure.

Локальное обновление и повторное развертывание модели

На этом шаге вы внесете некоторые изменения в модель данных task и веб-приложение, а затем опубликуете обновления в Azure.

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

Добавление столбца

В окне терминала на локальном компьютере перейдите к корневой папке репозитория Git.

Создайте перенос базы данных для таблицы tasks:

php artisan make:migration add_complete_column --table=tasks

Эта команда отображает имя файла переноса, который создается. Найдите этот файл в каталоге database/migrations и откройте его.

Замените метод up следующим кодом:

public function up()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->boolean('complete')->default(False);
    });
}

Предыдущий код добавляет столбец логических значений complete в таблицу tasks.

Замените метод down следующим кодом действия отката:

public function down()
{
    Schema::table('tasks', function (Blueprint $table) {
        $table->dropColumn('complete');
    });
}

В окне терминала на локальном компьютере выполните перенос базы данных Laravel, чтобы внести изменения в локальную базу данных.

php artisan migrate

В соответствии с условиями соглашения об именовании Laravel модель Task (см. app/Task.php) сопоставляется с таблицей tasks по умолчанию.

Обновление логики приложения

Откройте файл routes/web.php. В нем приложение определяет свои маршруты и бизнес-логику.

В конце файла добавьте маршрут с помощью следующего кода.

/**
 * Toggle Task completeness
 */
Route::post('/task/{id}', function ($id) {
    error_log('INFO: post /task/'.$id);
    $task = Task::findOrFail($id);

    $task->complete = !$task->complete;
    $task->save();

    return redirect('/');
});

Предыдущий код выполняет простое обновление модели данных, переключая значение complete.

Обновление представления

Откройте файл resources/views/tasks.blade.php. Найдите открывающий тег и замените его приведенным ниже значением.


Предыдущий код изменяет цвет строк в зависимости от того, завершена ли задача.

Следующая строка содержит приведенный ниже код.

{{ $task->name }}

Замените всю эту строку следующим кодом.


    
{{ csrf_field() }} {{ $task->name }}

Предыдущий код добавляет кнопку "Submit" (Отправить), которая ссылается на маршрут, определенный ранее.

Локальная проверка изменений

В окне терминала на локальном компьютере запустите сервер разработки из корневого каталога репозитория Git.

php artisan serve

Чтобы увидеть, как изменится состояние задачи, перейдите по адресу http://localhost:8000 и установите флажок.

Добавлен флажок для задачи

Чтобы остановить приложение PHP, введите Ctrl + C в окне терминала.

Публикация изменений в Azure

В окне терминала на локальном компьютере выполните перенос базы данных Laravel со строкой подключения рабочей базы данных, чтобы внести изменения в базу данных в Azure.

php artisan migrate --env=production --force

Зафиксируйте все изменения в Git, а затем отправьте изменения кода в Azure.

git add .
git commit -m "added complete checkbox"
git push azure main

После выполнения команды git push перейдите в приложение Azure и проверьте новые функции.

Изменения модели и базы данных, опубликованные в Azure

Добавленные задачи сохраняются в базе данных. Изменения в схеме данных не влияют на имеющиеся данные.

Очистка ресурсов

На предыдущем шаге вы создали ресурсы Azure в группе ресурсов. Если эти ресурсы вам не понадобятся в будущем, вы можете удалить группу ресурсов, выполнив следующую команду в Cloud Shell:

az group delete --name myResourceGroup

Введение

Это руководство позволит вам быстро освоить фреймворк Laravel. Оно содержит информацию о миграциях баз данных, Eloquent ORM, маршрутизации, проверке ввода, представлениях и Blade-шаблонах. Это отличная отправная точка для новичков в фреймворке Laravel и PHP-фреймворках в целом. Если вы уже использовали Laravel или другие PHP-фреймворки, вы можете ознакомиться с нашими более продвинутыми руководствами.

Чтобы рассмотреть основной набор функций Laravel, мы создадим простой список задач и будем придерживаться его (типичный пример списка «to-do»). Полный финальный вариант исходного кода для этого проекта доступен на GitHub.

Установка

Установка Laravel

Конечно, в первую очередь вам будет нужен свежий фреймворк Laravel. Чтобы запустить его, вы можете использовать виртуальную машину Homestead или локальную PHP-среду на ваш выбор. Как только ваше окружение будет готово, вы можете установить фреймворк Laravel, используя Composer:

shcomposer create-project laravel/laravel quickstart --prefer-dist

Установка проекта Quickstart (не обязательно)

Вы можете просто прочитать данное руководство. Однако, если вы хотите загрузить исходный код для этого руководства и выполнить его на локальной машине, то можете клонировать Git хранилище и установить зависимости:

shgit clone https://github.com/laravel/quickstart-basic quickstart
cd quickstart
composer install
php artisan migrate

Больше информации относительно создания локальной среды разработки Laravel вы сможете найти в документации по Homestead и по установке.

Подготовка базы данных

Миграции БД

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

Итак, давайте создадим таблицу БД, которая будет содержать все наши задачи. Для создания различных классов может быть использован интерфейс Artisan. Он избавит вас от ручной генерации кода при создании проектов Laravel. Поэтому давайте используем команду shmake:migration для создания миграции новой базы данных для нашей таблицы tasks:

shphp artisan make:migration create_tasks_table --create=tasks

Миграция будет помещена в каталог database/migrations вашего проекта. Как вы могли заметить, команда shmake:migration уже добавила автоинкремент ID и метки времени к файлу миграции. Давайте отредактируем этот файл и добавим дополнительный столбец string для имён наших задач:

PHP

use Illuminate\Database\Schema\Blueprint;
  use 
Illuminate\Database\Migrations\Migration;

  class 

CreateTasksTable extends Migration
  
{
    
/**
    * Запуск миграций
    *
    * @return void
    */
    
public function up()
    {
      
Schema::create('tasks', function (Blueprint $table) {
        
$table->increments('id');
        
$table->string('name');
        
$table->timestamps();
      });
    }
/**
    * Откатить миграции
    *
    * @return void
    */
    
public function down()
    {
      
Schema::drop('tasks');
    }
  }

Чтобы запустить нашу миграцию, мы будем использовать команду Artisan shmigrate. Если вы используете Homestead, вы должны выполнить эту команду в своей виртуальной машине, так как у вашей host-машины не будет прямого доступа к базе данных:

shphp artisan migrate

Эта команда создаст все наши таблицы БД. Если вы просматриваете таблицы БД, используя какой-либо клиент, вы должны заметить новую таблицу tasks, которая содержит столбцы, определённые в нашей миграции. Теперь мы готовы определить модель Eloquent ORM для наших задач!

Модели Eloquent

Eloquent — это стандартное ORM для Laravel (объектно-реляционное отображение). Eloquent делает безболезненным получение и хранение данных в вашей базе данных, используя чётко определённые «модели». Обычно, каждая Eloquent модель однозначно соответствует одной таблице базы данных.

Давайте определим модель Task, которая будет соответствовать только что созданной нами таблице tasks. Мы снова можем использовать команду Artisan, чтобы сгенерировать эту модель. В этом случае мы будем использовать команду shmake:model:

shphp artisan make:model Task

Модель будет помещена в каталог app вашего приложения. По умолчанию класс модели пуст. Нам не надо явно указывать, какой таблице соответствует Eloquent модель, потому что подразумевается, что имя таблицы – это имя модели во множественном числе (s на конце). В этом случае модель Task, как предполагается, соответствует таблице базы данных tasks. Вот на что должна быть похожа наша пустая модель:

PHP

namespace App;

  use 

Illuminate\Database\Eloquent\Model;

  class 

Task extends Model
  
{
    
//
  
}

Мы ещё познакомимся чуть ближе с моделями Eloquent, когда добавим маршруты к нашему приложению. Разумеется, вы можете заглянуть и в полную документацию по Eloquent для получения дополнительной информации.

Маршрутизация

Заглушки маршрутов

Теперь можно добавить несколько маршрутов в наше приложение. Маршруты используются для связи URL с контроллерами или анонимными функциями, которые должны быть выполнены, когда пользователь переходит на данную страницу. По умолчанию все маршруты Laravel определены в файле app/Http/routes.php, который автоматически добавляется в каждый новый проект.

Для нашего приложения нам будут нужны по крайней мере три маршрута: маршрут для вывода на экран списка всех наших задач, маршрут для добавления новых задач и маршрут для удаления существующих задач. Давайте напишем заглушки для всех этих маршрутов в файле app/Http/routes.php:

PHP

use App\Task;
  use 
Illuminate\Http\Request;/**
   * Вывести панель с задачами
   */
  
Route::get('/', function () {
    
//
  
});/**
   * Добавить новую задачу
   */
  
Route::post('/task', function (Request $request) {
    
//
  
});/**
   * Удалить задачу
   */
  
Route::delete('/task/{task}', function (Task $task) {
    
//
  
});

Если в вашей копии Laravel есть RouteServiceProvider, который уже содержит файл маршрутов по умолчанию в группе посредников web, то вам не надо вручную добавлять группу в ваш файл routes.php.

Вывод представления

Давайте заполним наш маршрут /. По этому маршруту мы хотим отрисовывать HTML-шаблон, который содержит форму добавления новой задачи, а также список всех текущих задач.

В Laravel все HTML-шаблоны хранятся в каталоге resources/views, и мы можем использовать вспомогательную функцию PHPview(), чтобы возвратить один из этих шаблонов по нашему маршруту:

PHP

Route::get('/', function () {
  return 
view('tasks');
});

Передача tasks в функцию PHPview() создаст экземпляр объекта View, который соответствует шаблону resources/views/tasks.blade.php.

Конечно, нам необходимо создать это представление, поэтому давайте сделаем это!

Создание макетов и представлений

Наше приложение содержит одно представление с формой добавления новых задач, а также список всех текущих задач. Чтобы помочь вам визуализировать представление, мы сделали скриншот законченного приложения со стандартными стилями Bootstrap CSS:

/packages/proger/habravel/uploads/374-basic-overview.png

Определяем макет

Почти все веб-приложения используют один макет на всех своих страницах. Например, у нашего приложения есть верхняя панель навигации, которая присутствовала бы на каждой странице (если бы у нас их было больше одной). Laravel упрощает использование этих общих функций на всех страницах, используя макеты Blade.

Как мы выяснили ранее, все представления Laravel хранятся в resources/views. Давайте определим представление нового макета в resources/views/layouts/app.blade.php. Расширение .blade.php даёт фреймворку команду использовать механизм шаблонной обработки Blade, чтобы отрисовать это представление. Конечно, в Laravel вы можете использовать и простые PHP-шаблоны. Однако Blade позволяет быстро написать простой и небольшой шаблон.

Наше представление app.blade.php должно выглядеть примерно так:

xml  


html lang="en">
  head>
    title>Laravel Quickstart - Basictitle>

    
  head>

  body>
    div class="container">
      nav class="navbar navbar-default">
        
      nav>
    div>

    @yield('content')
  body>
html>

Обратите внимание на строчку xml@yield('content') в макете. Это специальная Blade-директива для указания всем дочерним страницам, наследующим этот шаблон, где они могут внедрить своё содержимое. Давайте определим дочернее представление, которое будет использовать этот макет и выводить его основной контент.

Определяем дочернее представление

Теперь мы должны определить представление, которое содержит форму создания новой задачи, а также таблицу со списком всех существующих задач. Давайте определим это представление в resources/views/tasks.blade.php.

Мы пропустим небольшую часть Bootstrap CSS и сфокусируемся на важном. Помните, вы можете скачать весь исходный код этого приложения с ((https://github.com/laravel/quickstart-basic GitHub):

PHP

  

@extends(

'layouts.app')

@

section('content')

  

  

div class="panel-body">
    
    @include(
'common.errors')

    
    form action="{{ url('task') }}" method="POST" class="form-horizontal">
      {{ 
csrf_field() }}

      
      div class="form-group">
        label for="task" class="col-sm-3 control-label">Задачаlabel>

        

div class="col-sm-6">
          input type="text" name="name" id="task-name" class="form-control">
        
div>
      
div>

      
      div class="form-group">
        div class="col-sm-offset-3 col-sm-6">
          button type="submit" class="btn btn-default">
            class="fa fa-plus">iДобавить задачу
          
button>
        
div>
      
div>
    
form>
  
div>

  
@

endsection

Несколько разъясняющих замечаний

Прежде чем двигаться дальше, давайте немного поговорим об этом шаблоне. Во-первых, директива PHP@extends сообщает Blade, что мы используем макет, который мы определили в resources/views/layouts/app.blade.php. Все содержимое между PHP@section('content') и PHP@endsection будет добавлено вместо строчки директивы PHP@yield('content') в макете app.blade.php.

Директива PHP@include('common.errors') загрузит шаблон resources/views/common/errors.blade.php. Мы его ещё не определили, но скоро сделаем это!

Итак, мы определили основной макет и представление для нашего приложения. Помните, мы возвращаем это представление по маршруту /:

PHP

Route::get('/', function () {
  return 
view('tasks');
});

Теперь мы готовы добавить код в наш маршрут POST /task, чтобы обработать входящие данные из формы и добавить новую задачу в БД.

Добавление задач

Проверка ввода

Теперь, когда у нас есть форма на нашем представлении, мы должны добавить код к нашему маршруту POST /task в app/Http/routes.php, чтобы проверить входящие данные из формы и создать новую задачу. Во-первых, давайте проверим ввод.

Для этой формы мы создадим обязательное поле name и зададим, что оно должно содержать не более 255 символов. Если проверка не пройдёт, то мы перенаправим пользователя назад к URL /, а также возвратим ему в сессию его введённые данные с указанием на ошибки. Возврат введённых данных в сессию позволит нам сохранить их, даже если в них будут ошибки:

PHP

Route::post('/task', function (Request $request) {
  
$validator Validator::make($request->all(), [
    
'name' => 'required|max:255',
  ]);

  if (

$validator->fails()) {
    return 
redirect('/')
      ->
withInput()
      ->
withErrors($validator);
  }
// Создание задачи...
});

Переменная PHP$errors

Давайте сделаем перерыв на минутку, чтобы поговорить о строчке PHP->withErrors($validator) в нашем примере. Вызов PHP->withErrors($validator) подсветит в сессии ошибки данного экземпляра проверки ввода, и к ним можно будет обратиться через переменную PHP$errors в нашем представлении.

Помните, что мы использовали директиву PHP@include('common.errors') в нашем представлении, чтобы отобразить ошибки ввода формы. PHPcommon.errors позволяет нам легко показывать ошибки ввода в одинаковом формате на всех наших страницах. Давайте определим содержимое этого представления:

PHP

@if (

count($errors) > 0)
  
  div class="alert alert-danger">
    strong>УпсЧто-то пошло не так!strong>

    

br>br>

    

ul>
      @foreach (
$errors->all() as $error)
        li>{{ $error }}li>
      @endforeach
    
ul>
  
div>
@endif

Переменная PHP$errors доступна в любом представлении Laravel. Если не будет ошибок ввода, она просто будет пустым экземпляром PHPViewErrorBag.

Создание задачи

Теперь, когда обрабатывается ввод данных, давайте создадим новую задачу, продолжая заполнять наш маршрут. Как только новая задача была создана, мы перенаправим пользователя назад к URL /. Чтобы создать задачу, мы можем использовать метод PHPsave() после создания и установки свойств для новой модели Eloquent:

PHP

Route::post('/task', function (Request $request) {
  
$validator Validator::make($request->all(), [
    
'name' => 'required|max:255',
  ]);

  if (

$validator->fails()) {
    return 
redirect('/')
      ->
withInput()
      ->
withErrors($validator);
  }
$task = new Task;
  
$task->name $request->name;
  
$task->save();

  return 

redirect('/');
});

Отлично! Теперь мы можем создавать задачи. Давайте продолжим создание нашего представления, добавив список всех существующих задач.

Отображение существующих задач

Во-первых, мы должны отредактировать наш маршрут /, чтобы передать все существующие задачи в представление. Функция PHPview() принимает массив данных вторым параметром, который будет доступным для представления. Каждый ключ массива станет переменной в представлении:

PHP

Route::get('/', function () {
  
$tasks Task::orderBy('created_at''asc')->get();

  return 

view('tasks', [
    
'tasks' => $tasks
  
]);
});

Когда данные переданы, мы можем обращаться к задачам в нашем представлении tasks.blade.php и выводить их на экран таблицей. Blade-конструкция PHP@foreach позволяет нам кратко писать циклы, которые компилируются в молниеносный простой PHP-код:

PHP

@extends('layouts.app')

@

section('content')
  

  
  @if (

count($tasks) > 0)
    div class="panel panel-default">
      div class="panel-heading">
        
Текущая задача
      
div>

      

div class="panel-body">
        table class="table table-striped task-table">

          
          thead>
            th>Taskth>
            th> th>
          
thead>

          
          tbody>
            @foreach (
$tasks as $task)
              tr>
                
                td class="table-text">
                  div>{{ $task->name }}div>
                
td>

                

td>
                  
                
td>
              
tr>
            @endforeach
          
tbody>
        
table>
      
div>
    
div>
   @endif
@
endsection

Наше приложение почти готово. Но у нас нет способа удалять наши существующие задачи, когда они завершены. Давайте добавим и это!

Введение

Миграции похожи на контроль версий для вашей базы данных, позволяя вашей команде изменять и совместно использовать схему базы данных приложения. Миграции обычно выполняются совместно с построителем схем Laravel для построения схемы базы данных вашего приложения. Если вам когда-либо приходилось просить товарища по команде вручную добавить столбец в свою схему локальной базы данных, вы столкнулись с проблемой, которую решает миграция базы данных.

Фасад Laravel Schema обеспечивает независимую от базы данных поддержку для создания и управления таблицами во всех поддерживаемых Laravel системах баз данных.

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

Чтобы создать миграцию, используйте make:migration Artisan-команду :

php artisan make:migration create_users_table

Новая миграция будет помещена в ваш каталог database/migrations. Каждое имя файла миграции содержит метку времени, которая позволяет Laravel определять порядок миграций.

{tip} Заготовки миграции можно настроить с помощью публикации заглушек

Параметры --table и --create также могут использоваться для указания имени таблицы и того, будет ли миграция создавать новую таблицу. Эти параметры предварительно заполняют созданный файл-заглушку миграции указанной таблицей:

php artisan make:migration create_users_table --create=users

php artisan make:migration add_votes_to_users_table --table=users

Если вы хотите указать собственный выходной путь для сгенерированной миграции, вы можете использовать параметр --path при выполнении команды make:migration. Указанный путь должен быть относительно базового пути вашего приложения.

Подавление миграции

По мере создания приложения у вас может со временем накапливаться все больше и больше миграций. Это может привести к тому, что ваш каталог миграции станет раздутым за счет потенциально сотен миграций. Если хотите, можете " сжать " свои миграции в один файл SQL. Для начала выполните команду schema:dump:

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

Когда вы выполняете эту команду, Laravel запишет файл схемы " " в ваш каталог database/schema. Теперь, когда вы пытаетесь перенести свою базу данных, и никакие другие миграции не выполнялись, Laravel сначала выполнит SQL файла схемы. После выполнения команд файла схемы Laravel выполнит все оставшиеся миграции, которые не были частью дампа схемы.

Вы должны зафиксировать файл схемы базы данных в системе управления версиями, чтобы другие новые разработчики в вашей команде могли быстро создать исходную структуру базы данных вашего приложения.

{note} Ограничение миграции доступно только для баз данных MySQL, PostgreSQL и SQLite.

Структура миграции

Класс миграции содержит два метода: up и down. Метод up используется для добавления новых таблиц, столбцов или индексов в вашу базу данных, а метод down должен отменить операции, выполняемые методом up.

В обоих этих методах вы можете использовать построитель схем Laravel для выразительного создания и изменения таблиц. Чтобы узнать обо всех методах, доступных в Schema builder, ознакомьтесь с его документацией . Например, следующая миграция создает таблицу flights:

id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('flights');
    }
}

Запуск миграции

Чтобы запустить все незавершенные миграции, выполните Artisan-команду migrate:

php artisan migrate

{note} Если вы используете виртуальную машину Homestead , вы должны запустить эту команду из своей виртуальной машины.

Принудительный запуск миграции в рабочей среде

Некоторые операции миграции являются разрушительными, что означает, что они могут привести к потере данных. Чтобы защитить вас от запуска этих команд для вашей производственной базы данных, вам будет предложено подтвердить перед выполнением команд. Чтобы команды запускались без приглашения, используйте флаг --force:

php artisan migrate --force

Откат миграции

Чтобы откатить последнюю операцию миграции, вы можете использовать команду rollback. Эта команда откатывает последний " пакет " миграций, который может включать несколько файлов миграции:

php artisan migrate:rollback

Вы можете откатить ограниченное количество миграций, указав параметр step для команды rollback. Например, следующая команда откатит последние пять миграций:

php artisan migrate:rollback --step=5

Команда migrate:reset откатит все миграции вашего приложения:

php artisan migrate:reset

Откат & Перенос с помощью одной команды

Команда migrate:refresh откатит все ваши миграции, а затем выполнит команду migrate. Эта команда эффективно воссоздает всю вашу базу данных:

php artisan migrate:refresh

// Refresh the database and run all database seeds...
php artisan migrate:refresh --seed

Вы можете выполнить откат & для повторной миграции ограниченного количества миграций, указав параметр step команде refresh. Например, следующая команда откатит & повторно перенесет последние пять миграций:

php artisan migrate:refresh --step=5

Удалить все таблицы & Перенести

Команда migrate:fresh удалит все таблицы из базы данных, а затем выполнит команду migrate:

php artisan migrate:fresh

php artisan migrate:fresh --seed

Таблицы

Создание таблиц

Чтобы создать новую таблицу базы данных, используйте метод create фасада Schema. Метод create принимает два аргумента: первый - это имя таблицы, а второй - Closure, который принимает объект Blueprint, который может использоваться для определения новой таблицы:

Schema::create('users', function (Blueprint $table) {
    $table->id();
});

При создании таблицы вы можете использовать любой из методов построителя схемы для определения столбцов таблицы.

Проверка существования таблицы /столбца

Вы можете проверить наличие таблицы или столбца с помощью методов hasTable и hasColumn:

if (Schema::hasTable('users')) {
    //
}

if (Schema::hasColumn('users', 'email')) {
    //
}

Подключение к базе данных & Параметры таблицы

Если вы хотите выполнить операцию схемы с подключением к базе данных, которое не является вашим подключением по умолчанию, используйте метод connection:

Schema::connection('foo')->create('users', function (Blueprint $table) {
    $table->id();
});

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

Команда Описание
$table->engine='InnoDB'; Укажите механизм хранения таблиц (MySQL).
$table->charset='utf8mb4'; Укажите набор символов по умолчанию для таблицы (MySQL).
$table->collation='utf8mb4_unicode_ci'; Укажите параметры сортировки по умолчанию для таблицы (MySQL).
$table->temporary(); Создайте временную таблицу (кроме SQL Server).

Переименование /удаление таблиц

Чтобы переименовать существующую таблицу базы данных, используйте метод rename:

Schema::rename($from, $to);

Чтобы удалить существующую таблицу, вы можете использовать методы drop или dropIfExists:

Schema::drop('users');

Schema::dropIfExists('users');

Переименование таблиц с помощью внешних ключей

Перед переименованием таблицы вы должны убедиться, что любые ограничения внешнего ключа для таблицы имеют явное имя в ваших файлах миграции, вместо того, чтобы позволить Laravel назначать имя на основе соглашения. В противном случае имя ограничения внешнего ключа будет относиться к имени старой таблицы.

Столбцы

Создание столбцов

Метод table фасада Schema может использоваться для обновления существующих таблиц. Как и метод create, метод table принимает два аргумента: имя таблицы и Closure, который получает экземпляр Blueprint, который вы можете использовать для добавления столбцов в таблицу:

Schema::table('users', function (Blueprint $table) {
    $table->string('email');
});

Доступные типы столбцов

Построитель схемы содержит различные типы столбцов, которые вы можете указать при построении таблиц:

Команда Описание
$table->id(); Псевдоним $table->bigIncrements('id').
$table->foreignId('user_id'); Псевдоним $table->unsignedBigInteger('user_id').
$table->bigIncrements('id'); Автоинкремент столбца эквивалента UNSIGNED BIGINT (первичный ключ).
$table->bigInteger('votes'); Эквивалентный столбец BIGINT.
$table->binary('data'); Столбец эквивалента BLOB.
$table->boolean('confirmed'); BOOLEAN эквивалентный столбец.
$table->char('name', 100); Столбец, эквивалентный CHAR с длиной.
$table->date('created_at'); Эквивалентный столбец DATE.
$table->dateTime('created_at', 0); Эквивалентный столбец DATETIME с точностью (общее количество цифр).
$table->dateTimeTz('created_at', 0); Эквивалентный столбец DATETIME (с часовым поясом) с точностью (общее количество цифр).
$table->decimal('amount', 8, 2); Эквивалентный столбец DECIMAL с точностью (общее количество цифр) и масштабом (десятичные цифры).
$table->double('amount', 8, 2); ДВОЙНОЙ эквивалентный столбец с точностью (общее количество цифр) и масштабом (десятичные цифры).
$table->enum('level', ['easy', 'hard']); Эквивалентный столбец ENUM.
$table->float('amount', 8, 2); Эквивалентный столбец FLOAT с точностью (общее количество цифр) и масштабом (десятичные цифры).
$table->geometry('positions'); Эквивалентный столбец GEOMETRY.
$table->geometryCollection('positions'); Эквивалентный столбец GEOMETRYCOLLECTION.
$table->increments('id'); Автоинкремент столбца эквивалента UNSIGNED INTEGER (первичный ключ).
$table->integer('votes'); Эквивалентный столбец INTEGER.
$table->ipAddress('visitor'); Столбец эквивалента IP-адреса.
$table->json('options'); Эквивалентный столбец JSON.
$table->jsonb('options'); Эквивалентный столбец JSONB.
$table->lineString('positions'); Эквивалентный столбец LINESTRING.
$table->longText('description'); Эквивалентный столбец LONGTEXT.
$table->macAddress('device'); Столбец эквивалента MAC-адреса.
$table->mediumIncrements('id'); Автоматическое увеличение столбца эквивалента UNSIGNED MEDIUMINT (первичный ключ).
$table->mediumInteger('votes'); Эквивалентный столбец MEDIUMINT.
$table->mediumText('description'); Эквивалентный столбец MEDIUMTEXT.
$table->morphs('taggable'); Добавляет столбцы, эквивалентные taggable_id UNSIGNED BIGINT и taggable_type VARCHAR.
$table->uuidMorphs('taggable'); Добавляет столбцы, эквивалентные UUID taggable_id CHAR (36) и taggable_type VARCHAR (255).
$table->multiLineString('positions'); Эквивалентный столбец MULTILINESTRING.
$table->multiPoint('positions'); Эквивалентный столбец MULTIPOINT.
$table->multiPolygon('positions'); Эквивалентный столбец MULTIPOLYGON.
$table->nullableMorphs('taggable'); Добавляет версии morphs() столбцов, допускающие значение NULL.
$table->nullableUuidMorphs('taggable'); Добавляет версии uuidMorphs() столбцов, допускающие значение NULL.
$table->nullableTimestamps(0); Псевдоним метода timestamps().
$table->point('position'); Эквивалентный столбец POINT.
$table->polygon('positions'); Эквивалентный столбец POLYGON.
$table->rememberToken(); Добавляет эквивалентный столбец remember_token VARCHAR (100), допускающий значение NULL.
$table->set('flavors', ['strawberry', 'vanilla']); SET эквивалентный столбец.
$table->smallIncrements('id'); Автоприращение эквивалентного столбца UNSIGNED SMALLINT (первичный ключ).
$table->smallInteger('votes'); Эквивалентный столбец SMALLINT.
$table->softDeletes('deleted_at', 0); Добавляет эквивалентный столбец deleted_at TIMESTAMP, допускающий значение NULL, для мягкого удаления с точностью (общее количество цифр).
$table->softDeletesTz('deleted_at', 0); Добавляет эквивалентный столбец deleted_at TIMESTAMP (с часовым поясом), допускающий значение NULL, для мягкого удаления с точностью (общее количество цифр).
$table->string('name', 100); Эквивалентный столбец VARCHAR с длиной.
$table->text('description'); Эквивалентный столбец TEXT.
$table->time('sunrise', 0); Эквивалентный столбец TIME с точностью (общее количество цифр).
$table->timeTz('sunrise', 0); Эквивалентный столбец TIME (с часовым поясом) с точностью (общее количество цифр).
$table->timestamp('added_on', 0); Эквивалентный столбец TIMESTAMP с точностью (общее количество цифр).
$table->timestampTz('added_on', 0); Эквивалентный столбец TIMESTAMP (с часовым поясом) с точностью (общее количество цифр).
$table->timestamps(0); Добавляет обнуляемые столбцы created_at и updated_at TIMESTAMP с точностью (общее количество цифр).
$table->timestampsTz(0); Добавляет эквивалентные столбцы created_at и updated_at TIMESTAMP (с часовым поясом), допускающие значение NULL, с точностью (общее количество цифр).
$table->tinyIncrements('id'); Автоматическое увеличение столбца эквивалента UNSIGNED TINYINT (первичный ключ).
$table->tinyInteger('votes'); Эквивалентный столбец TINYINT.
$table->unsignedBigInteger('votes'); UNSIGNED BIGINT эквивалентный столбец.
$table->unsignedDecimal('amount', 8, 2); UNSIGNED DECIMAL эквивалентный столбец с точностью (общее количество цифр) и масштабом (десятичные цифры).
$table->unsignedInteger('votes'); Эквивалентный столбец UNSIGNED INTEGER.
$table->unsignedMediumInteger('votes'); Эквивалентный столбец UNSIGNED MEDIUMINT.
$table->unsignedSmallInteger('votes'); UNSIGNED SMALLINT эквивалентный столбец.
$table->unsignedTinyInteger('votes'); НЕПОДПИСАННЫЙ эквивалентный столбец TINYINT.
$table->uuid('id'); Эквивалентный столбец UUID.
$table->year('birth_year'); Годовой эквивалент столбца.

Модификаторы столбца

В дополнение к типам столбцов, перечисленным выше, существует несколько модификаторов столбцов " ", которые вы можете использовать при добавлении столбца в таблицу базы данных. Например, чтобы сделать столбец " допускающим значение NULL ", вы можете использовать метод nullable:

Schema::table('users', function (Blueprint $table) {
    $table->string('email')->nullable();
});

Следующий список содержит все доступные модификаторы столбцов. В этот список не входят модификаторы индекса :

Модификатор Описание
->after('column') Поместите столбец " после " другого столбца (MySQL)
->autoIncrement() Установить столбцы INTEGER как автоинкремент (первичный ключ)
->charset('utf8mb4') Укажите набор символов для столбца (MySQL)
->collation('utf8mb4_unicode_ci') Укажите параметры сортировки для столбца (MySQL /PostgreSQL /SQL Server)
->comment('my comment') Добавить комментарий в столбец (MySQL /PostgreSQL)
->default($value) Укажите значение " по умолчанию " для столбца
->first() Поместите столбец " первым " в таблицу (MySQL)
->nullable($value=true) Позволяет (по умолчанию) вставлять значения NULL в столбец
->storedAs($expression) Создать сохраненный сгенерированный столбец (MySQL)
->unsigned() Установить столбцы INTEGER как UNSIGNED (MySQL)
->useCurrent() Установите столбцы TIMESTAMP, чтобы использовать CURRENT_TIMESTAMP в качестве значения по умолчанию
->virtualAs($expression) Создать виртуальный сгенерированный столбец (MySQL)
->generatedAs($expression) Создание столбца идентификаторов с указанными параметрами последовательности (PostgreSQL)
->always() Определяет приоритет значений последовательности над вводом для столбца идентификаторов (PostgreSQL)

Выражения по умолчанию

Модификатор default принимает значение или экземпляр \Illuminate\Database\Query\Expression. Использование экземпляра Expression предотвратит заключение значения в кавычки и позволит вам использовать специальные функции базы данных. Одна из ситуаций, когда это особенно полезно, - это когда вам нужно назначить значения по умолчанию для столбцов JSON:

id();
            $table->json('movies')->default(new Expression('(JSON_ARRAY())'));
            $table->timestamps();
        });
    }
}

{note} Поддержка выражений по умолчанию зависит от драйвера базы данных, версии базы данных и типа поля. Пожалуйста, обратитесь к соответствующей документации по совместимости. Также обратите внимание, что использование специальных функций базы данных может тесно связать вас с конкретным драйвером.

Изменение столбцов

Предпосылки

Перед изменением столбца обязательно добавьте зависимость doctrine/dbal в свой composer.json файл. Библиотека Doctrine DBAL используется для определения текущего состояния столбца и создания SQL-запросов, необходимых для внесения необходимых корректировок:

composer require doctrine/dbal

Обновление атрибутов столбца

Метод change позволяет изменять тип и атрибуты существующих столбцов. Например, вы можете увеличить размер столбца string. Чтобы увидеть метод change в действии, увеличим размер столбца name с 25 до 50:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->change();
});

Мы также можем изменить столбец, чтобы он допускал значение NULL:

Schema::table('users', function (Blueprint $table) {
    $table->string('name', 50)->nullable()->change();
});

{note} Только следующие типы столбцов могут быть " изменены ": bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time , unsignedBigInteger, unsignedInteger, unsignedSmallInteger и uuid.

Переименование столбцов

Чтобы переименовать столбец, вы можете использовать метод renameColumn в построителе схемы. Перед переименованием столбца обязательно добавьте зависимость doctrine/dbal в свой composer.json файл:

Schema::table('users', function (Blueprint $table) {
    $table->renameColumn('from', 'to');
});

{note} Переименование любого столбца в таблице, в котором также есть столбец типа enum, в настоящее время не поддерживается.

Удаление столбцов

Чтобы удалить столбец, используйте метод dropColumn в построителе схемы. Перед удалением столбцов из базы данных SQLite вам необходимо добавить зависимость doctrine/dbal в файл composer.json и запустить команду composer update в вашем терминале, чтобы установить библиотеку:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('votes');
});

Вы можете удалить несколько столбцов из таблицы, передав массив имен столбцов методу dropColumn:

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn(['votes', 'avatar', 'location']);
});

{note} Удаление или изменение нескольких столбцов в рамках одной миграции при использовании базы данных SQLite не поддерживается.

Доступные псевдонимы команд

Команда Описание
$table->dropMorphs('morphable'); Отбросьте столбцы morphable_id и morphable_type.
$table->dropRememberToken(); Отбросьте столбец remember_token.
$table->dropSoftDeletes(); Отбросьте столбец deleted_at.
$table->dropSoftDeletesTz(); Псевдоним метода dropSoftDeletes().
$table->dropTimestamps(); Отбросьте столбцы created_at и updated_at.
$table->dropTimestampsTz(); Псевдоним метода dropTimestamps().

Запуск миграций

Для запуска всех необходимых миграций предназначена Artisan-команда migrate:

> php artisan migrate

Некоторые операции миграций разрушительны и могут привести к потере данных. Для предотвращения случайного запуска этих команд на боевой БД перед их выполнением запрашивается подтверждение. Для принудительного запуска команд без подтверждения предназначена опция --force:

> php artisan migrate --force

Откат миграций

Для отмены изменений, сделанных последней миграцией, предназаначена команда rollback. Она отменяет результат последней «партии» миграций, которая может включать несколько файлов миграций:

> php artisan migrate:rollback

Можно выполнить откат определённого числа миграций, указав опцию --step для команды rollback:

> php artisan migrate:rollback --step=5

Команда migrate:reset отменит изменения всех миграций приложения:

> php artisan migrate:reset

Миграция

Первый файл – миграция в директории database/migrations.

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Миграция – SQL-запрос, который выполняется в базе при любом её изменении. В данном случае запрос создаёт таблицу articles. Это соглашение пришло в Laravel из Rails: для каждой модели создаётся таблица, где имя модели берётся в нижнем регистре и множественном числе. Например Articlearticles или Personpeople.

Сама миграция не выглядит как SQL. Внутри неё используется библиотека, которая позволяет описывать изменения в базе в виде кода, который затем превращается в SQL. Структура этого кода достаточно проста, если знать PHP. В нём описывается таблица, все её колонки и их типы.

По умолчанию Laravel добавляют в миграцию два вызова:

  • $table->id(); – колонка, которая будет первичным ключом.
  • $table->timestamps() – два поля: updated_at (время последнего обновления) и created_at (время добавления). Это стандартная практика для многих фреймворков, эти колонки добавляются во все таблицы для удобства отслеживания дат.

Остальные колонки нужно добавлять самостоятельно. Для статей полная миграция выглядит так:

Schema::create('articles', function (Blueprint $table) {
    $table->id();
    $table->string('name'); // название статьи
    $table->text('body'); // тело статьи
    $table->timestamps();
});

Миграции не выполняются автоматически. Их нужно "применять" или, как говорят "накатывать" на базу данных. Команда php artisan migrate находит все миграции, которые ещё не были применены и выполняет их все в том порядке, в котором они расположены в файловой системе.

$ php artisan migrate
Migrating: 2020_03_21_000000_create_articles_table
Migrated:  2020_03_21_000000_create_articles_table

Если все прошло успешно, то в базе данных появилась таблица articles.

Миграции можно не только накатывать, но и откатывать. Для этого нужно набрать php artisan migrate:rollback. Эта команда попробует отменить последнюю миграцию. Повторный вызов откатит ещё одну миграцию, которая была перед последней. И так далее до самого конца.

Теперь можно переходить к модели.

Модель

Второй файл – класс (модель) с именем Article в директории app/Models

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    //
}

Модель в Laravel – это класс который наследуется от Model. В самом простом случае, этот класс не содержит ни строчки кода. Большую часть работы по его функционированию берет на себя Eloquent. Эта ORM связывает класс с таблицей в базе данных и предоставляет множество необходимых методов, которых достаточно для большинства задач.

Подробнее о том как работает модель – в следующем уроке.