Миграции, работа с бд, создание таблиц (Урок 2)

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

Начнем с создания БД, запустите open server, после чего нажмите на уже знакомый вам флажок в правом нижнем углу, выберите дополнительно->PhpMyAdmin Войдите в PhpMyAdmin, как правило пользователь root, а пароль пустой. Создайте новую базу данных, у меня она будет назыаться larablog Теперь надо сказать ларавелю с какой бд мы будем работать, для этого откройте папку с вашим проектом, который вы создали в прошлом уроке, откройте файл .env и отредактируйте его, указав данные для подключения к вашей базе данных, пример ниже

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=larablog
DB_USERNAME=root
DB_PASSWORD=

В DB_DATABASE я укажите название ваше базы данных, в DB_USERNAME указажите пользователя этой бд - root, DB_PASSWORD - я указывать не стал, т.к. у меня пароля нет, у вас может быть по другому.

Мы будем придерживаться в нашем проекте системы MVC - Мodel View Controller (Модель вид контроллер), если не знаете, что это то советую ознакомиться с этим в интернете более подробно.

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

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

Перед тем, как создать нашу первую модель и миграцию, я немного расскажу, что такое миграции. Миграции это штука, которая напоминает систему контроля версий, только в данном случае для БД. Благодаря им, можно менять схему БД и отслеживать эти изменения. Перейдите в консоли в папку с вашим проектом, в моем случае это

cd domains\laratest1.ru
Теперь выполним последовательно в консоли две команды, которые создадут две модели и миграции к ним, после чего я поясню, что мы сделали.

php artisan make:model Models/BlogCategory -m
php artisan make:model Models/BlogPost -m
php artisan make:model Models/BlogComments -m

Если вы все сделали правильно, то у вас после каждой команды появится сначала Model created successfully. И Created Migration: бла бла бла.

Наши модели, которые мы создали находятся тут app\Models, все миграции хранятся тут database\migrations. В миграции есть методы up и down. Метод up служит для добавления новых столбцов или индексов в базу данных, а down служит для отмены операций, который вы сделали методом up.

Модель и миграция BlogCategory слежит для наших категорий, BlogPost нужен для работы с постами нашего блога, а BlogComments служит для работы с комментариями к постам нашего блога.

Откроем нашу миграцию, которая работает с категориями блога и отредактируем в ней метод up, вставив в этот метод следующий код:

Schema::create('blog_categories', function (Blueprint $table) {
	$table->increments('id');
	$table->integer('parent_id')->unsigned()->default(0);
	$table->string('slug')->unique();
	$table->string('title');
	$table->text('description')->nullable();
				
	$table->timestamps();
	$table->softDeletes();
			
});

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

В строчке $table->integer('parent_id')->unsigned()->default(0); напись unsigned() говорит, что поле parent_id у нас будет от 0 и выше, а надпись default(0) говорит, что по умолчанию он будет равен 0.

Столбец slug - нужен нам будет для формирования урл, я пока еще не определился как именно у нас будет формироваться урл, поэтому навсякий случай,если он будет формироваться не по id, добавим этот столбец. Надпись unique(); говорит о том, что поле slug должно быть уникальным

Теперь, что касается строчек $table->timestamps(); и $table->softDeletes(); Первая добавит столбцы created_at и updated_at, т.е. когда была создана и обновлена категория, а вторая добавит поле deleted_at это поле будет служить для мягкого удаления, т.е. по факту запись остается в таблице, но если этот столбец заполнен, то она считается как удаленная.

Откроем нашу миграцию, которая работает с постами и отредактируем в ней метод up, вставив в этот метод следующий код:

Schema::create('blog_posts', function (Blueprint $table) {
	$table->increments('id');
		
	$table->integer('category_id')->unsigned();
	$table->integer('user_id')->unsigned();
			
	$table->string('slug')->unique();
	$table->string('title');
			
	$table->text('excerpt')->nullable();
			
	$table->text('content_raw')->nullable();
	$table->text('content_html')->nullable();
		
	$table->boolean('is_published')->default(false);
	$table->timestamp('published_at')->nullable();			
			
    $table->timestamps();
	$table->softDeletes();
		
	$table->foreign('category_id')->references('id')->on('blog_categories');
	$table->foreign('user_id')->references('id')->on('users');
	
	$table->index('is_published');
});

Столбец excerpt - будет хранить краткое описание нашего поста, что-то вроде анонса. content_raw и content_html соответственно будут служить для основного текста самого поста. is_published - обозначет опубликован ли пост, published_at - когда он был опубликован.

Отмечу строчку $table->foreign('category_id')->references('id')->on('blog_categories'); она означает, что в столбец category_id будет записываться id категории из таблицы blog_categories. Соответственно строчка $table->foreign('user_id')->references('id')->on('users'); означает, что в столбец user_id будет записывать id пользователя из таблицы users.

Теперь откроем файл миграции с комментариями и отредактируем у него метод up, вставив в этот метод такой код:

Schema::create('blog_comments', function (Blueprint $table) {
	$table->increments('id');
	$table->integer('user_id')->unsigned();
	$table->integer('post_id')->unsigned();
			
	$table->text('cooment')->nullable();		
	$table->foreign('post_id')->references('id')->on('blog_posts');
	$table->foreign('user_id')->references('id')->on('users');
					
	$table->timestamps();
	$table->softDeletes();
});

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

Откройте файл с миграциями пользователей и внесите небольшие изменения:

Schema::create('users', function (Blueprint $table) {
	$table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Перед тем, как запустить миграции, если вы не используете как и я homestead или вы используете MariaDB, то вам нужно сделать следующее: в файле \app\Providers\AppServiceProvider.php вставьте следующий код:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
	/**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
	{
		Schema::defaultStringLength(191);
	}
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    
}

Теперь надо запустить наши миграции, чтобы создать все эти таблицы, для этого выполните в консоли команду:

php artisan migrate

Зайдите в бд и проверьте, у вас должны будут появится таблицы.

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

Комменатрии
Den 15.05.2020 02:10:32
Откройте файл с миграциями пользователей это где?
Ответить
Станислав 15.05.2020 10:15:10
Den, это находится в этой папке \database\migrations там файл с длинным названием в его названии должно присутствовать слово users название вашей таблицы с пользователями
Ответить
Ден 18.05.2020 22:40:33
спасибо, там в названии файла миграции стояла дата 2014_ а не 2020_ я подумал эта другая, прошлая
Ответить
Добавить комментарий