четверг, 6 июля 2017 г.

LARAVEL. МИГРАЦИИ

Миграции - упрощенная система контроля версий для БД, которая позволяет отслеживать изменения и создавать таблицы БД, используя команды консоли.
И методы специального конструктора таблиц класса схема.


Глобальные настройки БД находятся в \config\database.php
В Laravel используется PDO.

'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],

Функция env предоставляет доступ к локальным переменным вашей среды разработки.
Эта функция находится в файле .env в корне.

Изменим настройки подключения:
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=tlaravel
DB_USERNAME=root
DB_PASSWORD=

Идем в \config\database.php
В параметре migrations указано имя таблицы, в которой будет храниться информация о применяемых миграциях проекта.

Создадим миграцию.
Идем в консоль и пишем команду: php artisan make:migration create_articles_table

Создаваемые миграции располагаются здесь: \database\migrations
Наш файл: 2017_07_06_154659_create_articles_table.php

Метод up выполняется, когда мы выполняем конкретную миграцию. Метод down выполняется, когда мы отменяем миграцию, когда откатывем изменения.

Если необходимо создать новую таблицу в БД, то пишем новую команду для консоли:
php artisan make:migration create_articles_table --create=articles

ВНИМАНИЕ!!! ЕСЛИ МИГРАЦИИ НЕ СОЗДАЮТСЯ, ТО РЕШЕНИЕ:
https://stackoverflow.com/questions/25237415/php-artisan-migratereset-failed-to-open-stream-no-such-file-or-directory
composer dump-autoload
php artisan migrate:rollback

Создается:
<?php

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->increments('id'); // id INT AUTO_INCREMENT PRIMARY KEY
$table->timestamps(); // здесь будет храниться время создания и модификации конкретной записи
});
}

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

Мы можем указывать свои данные для формирования таблиц.
См. документацию: https://laravel.com/docs/5.4/migrations

Добавим в таблицу artcles несколько полей в методе up:

public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 100); // поле для названия статей varchar 100 символов
$table->text('text', 100); // текст статьи
$table->string('img', 255); // картинка
$table->timestamps();
});
}

Применим миграцию
Для этого в консоли напишем: php artisan migrate


Отменим миграцию, т.е запустим в работу метод down.
Для этого в консоли напишем: php artisan migrate:rollback

Изменим таблицу: php artisan make:migration change_articles_table —table=articles

Открываем файл: 2017_07_06_172659_change_articles_table.php
Создадим новое поле для таблицы:
public function up()
{
Schema::table('articles', function (Blueprint $table) {
//
$table->string('alias', 100);
});
}

А в методе down удалим столбец:

public function down()
{
Schema::table('articles', function (Blueprint $table) {
//
$table->dropColumn('alias'); // удалим столбец
});
}

Идем в консоль: php artisan migrate
Теперь мы видим, что была применена всего одна миграция. В articles добавлено поле alias.

Откатим миграцию: php artisan migrate:rollback
Поле alias исчезло.

Вернем его. php artisan migrate

Если нужно отменить все миграции: php artisan migrate:reset
Эта команда отменяет действия всех миграций.

Снова выполним все миграции: php artisan migrate

Мы можем использовать логику при формировании миграций.

Если данная таблица существует, то мы можем с ней работать:
public function up()
{
if(Schema::hasTable('articles')) {
Schema::table('articles', function (Blueprint $table) {
$table->string('alias', 100);
});
}

}

Определим, есть ли в таблице столбец. Если столбец не существует, то мы его создадим:
public function up()
{
if(Schema::hasTable('articles')) {
Schema::table('articles', function (Blueprint $table) {
if(!Schema::hasColumn('alias')) {
$table->string('alias', 100);
}
});
}

}

При создании таблицы, мы можем указать движок таблицы. В файле 2017_07_06_164539_create_articles_table.php

public function up()
{
Schema::create('articles', function (Blueprint $table) {
//$table->engine = 'InnoDB';
$table->increments('id');
$table->string('name', 100); // поле для названия статей varchar 100 символов
$table->text('text', 100); // текст статьи
$table->string('img', 255); // картинка
$table->timestamps();
});
}

Если необходимо изменить конкретные атрибуты.
В 2017_07_06_172659_change_articles_table.php укажем значние по умолчанию.
public function up()
{
if(Schema::hasTable('articles')) {
Schema::table('articles', function (Blueprint $table) {
if(!Schema::hasColumn('alias')) {
$table->string('alias', 100)->default('default');
}
});
}

}


Если установить дополнительное расширение doctrine/dbal, то можно изменять таблицы.
В корне сайта открываем файл composer.json
Прописываем новую зависимость.
"require": {
"php": ">=5.6.4",
"laravel/framework": "5.4.*",
"laravel/tinker": "~1.0",
"doctrine/dbal": "*"
},

Версия нам не нужна, поэтому указываем *.
Идем в консоль и пишем: composer update
Обновляем зависимости проекта.

Создадим еще одну миграцию.
php artisan make:migration change_articles_table2 —table=articles

<?php

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

class ChangeArticlesTable2 extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('articles', function (Blueprint $table) {
//
$table->string('alias')->default('alias')->change();
});
}

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


Применим данную миграцию:
php artisan migrate

Идем в БД. Теперь в нашем поле по умолчанию указано значение alias:
7 alias varchar(255) utf8mb4_unicode_ci Нет alias


Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html