<?php
use App\Models\Comment;
use App\Models\File;
use App\Models\Guestbook;
use App\Models\Poll;
use App\Models\Read;
use App\Models\Story;
use App\Models\Tag;
use App\Models\User;
use MotorORM\Migration;
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
require __DIR__ . '/../../vendor/autoload.php';
// Добавляет поля picture и avatar в users
$userHeaders = User::query()->headers();
if (! in_array('picture', $userHeaders, true)) {
$migration = new Migration(new User());
try {
$migration->column('picture')->after('name')->create();
$migration->column('avatar')->after('picture')->create();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлены поля picture и avatar в таблицу users<br>';
}
// Добавляет поле user_id и удаляет login
$guestbookHeaders = Guestbook::query()->headers();
if (! in_array('user_id', $guestbookHeaders, true)) {
$migration = new Migration(new Guestbook());
try {
$migration->column('user_id')->after('id')->create();
$messages = Guestbook::query()->get();
foreach ($messages as $message) {
$user = User::query()->where('login', $message->login)->first();
$message->where('id', $message->id)->update([
'user_id' => $user->id ?? '',
]);
}
$migration->column('login')->delete();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлено поле user_id в таблицу guestbook<br>';
}
// Переносит image из guestbook в files
$guestbookHeaders = Guestbook::query()->headers();
if (in_array('image', $guestbookHeaders, true)) {
$migration = new Migration(new Guestbook());
try {
$messages = Guestbook::query()->get();
foreach ($messages as $message) {
if (! $message->image) {
continue;
}
File::query()->create([
'user_id' => $message->user_id,
'post_id' => $message->id,
'path' => $message->image,
'created_at' => $message->created_at,
]);
}
$migration->column('image')->delete();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Поле image перенесено из таблицы guestbook в таблицу files<br>';
}
// Добавляет поля name, ext и size в files
$fileHeaders = File::query()->headers();
if (! in_array('ext', $fileHeaders, true)) {
$migration = new Migration(new File());
try {
$migration->column('name')->after('path')->create();
$migration->column('ext')->after('name')->create();
$migration->column('size')->after('ext')->create();
$files = File::query()->get();
foreach ($files as $file) {
$file->where('id', $file->id)->update([
'name' => basename($file->path),
'ext' => getExtension($file->path),
'size' => filesize(publicPath($file->path)) ?? 0,
]);
}
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлены поля name, ext и size в таблицу files<br>';
}
// Добавляет поле name и удаляет title из guestbook
$guestbookHeaders = Guestbook::query()->headers();
if (! in_array('name', $guestbookHeaders, true)) {
$migration = new Migration(new Guestbook());
try {
$migration->column('name')->after('text')->create();
$migration->column('title')->delete();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлено поле name и удалено title из таблицы guestbook<br>';
}
// Добавляет поле rating в stories
$storyHeaders = Story::query()->headers();
if (! in_array('rating', $storyHeaders, true)) {
$migration = new Migration(new Story());
try {
$migration->column('rating')->after('tags')->default(0)->create();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлено поле rating в таблицу stories<br>';
}
// Переименовывает поле views в reads в stories
$storyHeaders = Story::query()->headers();
if (in_array('views', $storyHeaders, true)) {
$migration = new Migration(new Story());
try {
$migration->column('views')->to('reads')->rename();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Переименовано поле views на reads в таблице stories<br>';
}
// Переименовывает поле post_id в story_id в comments
$commentHeaders = Comment::query()->headers();
if (in_array('post_id', $commentHeaders, true)) {
$migration = new Migration(new Comment());
try {
$migration->column('post_id')->to('story_id')->rename();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Переименовано поле post_id в story_id в таблице comments<br>';
}
// Переименовывает поле post_id в story_id в files
$fileHeaders = File::query()->headers();
if (in_array('post_id', $fileHeaders, true)) {
$migration = new Migration(new File());
try {
$migration->column('post_id')->to('story_id')->rename();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Переименовано поле post_id в story_id в таблице files<br>';
}
// Переименовывает поле post_id в story_id в polls
$pollHeaders = Poll::query()->headers();
if (in_array('post_id', $pollHeaders, true)) {
$migration = new Migration(new Poll());
try {
$migration->column('post_id')->to('story_id')->rename();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Переименовано поле post_id в story_id в таблице polls<br>';
}
// Переименовывает поле post_id в story_id в reads
$readHeaders = Read::query()->headers();
if (in_array('post_id', $readHeaders, true)) {
$migration = new Migration(new Read());
try {
$migration->column('post_id')->to('story_id')->rename();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Переименовано поле post_id в story_id в таблице reads<br>';
}
// Переименовывает поле story_id в entity_id в polls
$pollHeaders = Poll::query()->headers();
if (in_array('story_id', $pollHeaders, true)) {
$migration = new Migration(new Poll());
try {
$migration->column('story_id')->to('entity_id')->rename();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Переименовано поле story_id в entity_id в таблице polls<br>';
}
// Добавляет поле entity_name в polls
$pollHeaders = Poll::query()->headers();
if (! in_array('entity_name', $pollHeaders, true)) {
$migration = new Migration(new Poll());
try {
$migration->column('entity_name')->after('entity_id')->default('story')->create();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлено поле entity_name в таблицу polls<br>';
}
// Добавляет поле locked в stories
$storyHeaders = Story::query()->headers();
if (! in_array('locked', $storyHeaders, true)) {
$migration = new Migration(new Story());
try {
$migration->column('locked')->after('reads')->default(0)->create();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Добавлено поле locked в таблицу stories<br>';
}
// Удаляет поле tags в stories
$storyHeaders = Story::query()->headers();
if (in_array('tags', $storyHeaders, true)) {
$migration = new Migration(new Story());
try {
$migration->column('tags')->to('tags_old')->rename();
$stories = Story::query()->get();
foreach ($stories as $story) {
$tags = explode(',', $story->tags_old);
foreach ($tags as $tag) {
if (! $tag) {
continue;
}
Tag::query()->create([
'story_id' => $story->id,
'tag' => $tag,
]);
}
}
$migration->column('tags_old')->delete();
} catch (Exception $exception) {
echo $exception->getMessage();
}
echo 'Удалено поле tags из таблицы stories<br>';
}
echo 'Все миграции выполнены успешно!<br>';