DEV Community

Cover image for Database Seed - MarketPlace - #2
Marcio Policarpo
Marcio Policarpo

Posted on

2

Database Seed - MarketPlace - #2

Esta é a segunda parte do artigo sobre criação de dados de forma relacional para testar mais consistentemente sua aplicação.

Na primeira parte fiz uma breve introdução sobre a proposta do projeto.

Agora vamos iniciar o desenvolvimento das migrações.


Migração

Migrações, a grosso modo, são uma maneira de versionar o schema de um banco de dados.

Embora boa parte dos frameworks atuais possua uma forma de gerenciar migrações, ela não é mandatória para o desenvolvimento de um projeto.

Aliás é comum vermos migrações em projetos que estão começando, por se enquadrarem mais facilmente em metodologias e boas práticas de desenvolvimento.

Entretanto isso não significa que projetos legados não possam ter o schema versionado. Ocorre que nestes casos (projetos legados) há pouca ou às vezes nenhuma documentação disponível sobre o projeto, dificultando significativamente esta tarefa.


Projeto

O projeto proposto para esta série de artigos será uma aplicação Laravel. Por essa razão, vou presumir que você, leitor, já tenha conhecimento prévio nesse framework.

Caso este não seja o seu cenário, sugiro dar uma lida neste artigo onde explico como configurar a conexão com um banco de dados, além de outros detalhes.


Abra o terminal de sua preferência e acesse a pasta onde o projeto será criado.

A partir desta pasta digite o seguinte:

composer create-project laravel/laravel fake-data
Enter fullscreen mode Exit fullscreen mode

O tempo para conclusão desta tarefa varia de acordo com a configuração da máquina e a conexão com a internet.

Concluída esta etapa, ainda no terminal, acesse a pasta do projeto para criar as migrações, processo este que é realizado através do seguinte comando:

php artisan make:migration <nome_da_migracao> [opções]
Enter fullscreen mode Exit fullscreen mode

OBS.: É possível criar com um único comando a migração, a 'controller', o modelo e a 'factory'. Esta abordagem não será adotada para possibilitar explicações mais detalhadas em cada fase.


'Mão na massa'

⚠️ A sequência de criação das migrações é de extrema relevância porque serão executadas no banco de dados na ordem em que forem criadas.

Com isso em mente daremos início à criação das migrações sendo que para cada uma delas vou passar o comando que deve ser executado no terminal e logo em seguida, como a classe deverá ficar.

Para alterar a classe utilize um editor de código no qual você já esteja habituado. Estou utilizando o VSCode por ser pequeno e versátil.


Customers

No terminal, dentro do diretório raiz da aplicação, digite o seguinte:

php artisan make:migration create_customers_table
Enter fullscreen mode Exit fullscreen mode

Assim que o comando for concluído, você notará que um novo arquivo foi adicionado à pasta \database\migrations. O nome desse arquivo é composto pelo ano, mês, dia, hora, minuto e segundo da sua criação, seguido pelo nome que demos no comando informado no terminal.

Essa padronização garante que cada migração tenha um nome único e servirá de índice quando as tabelas forem criadas no banco de dados.

Portanto, não se preocupe se os nomes dos arquivos ficarem diferentes daqueles que listarei a seguir. ☺️

Quando criei a migração o arquivo recebeu este nome:
2022_09_29_215131_create_customers_table.php

E o caminho completo dentro da aplicação ficou assim:
\database\migrations\2022_09_29_215131_create_customers_table.php

Edite o arquivo substituindo todo conteúdo pelo listado a seguir:

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained();
            $table->string('last_name');
            $table->string('first_name');
            $table->string('email')->nullable();
            $table->string('phone', 30)->nullable();
            $table->string('street');
            $table->string('city');
            $table->string('building_number', 30);
            $table->string('country');
            $table->string('post_code');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('customers');
    }
};
Enter fullscreen mode Exit fullscreen mode

Shops

Repetindo os passos executados na criação da migração anterior...

php artisan make:migration create_shops_table
Enter fullscreen mode Exit fullscreen mode

...obtemos um novo arquivo que, no meu caso, será este:

\database\migrations\2022_09_29_215237_create_shops_table.php

Agora vamos editá-lo, substituindo o conteúdo pelo mostrado logo abaixo:

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('shops', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained();
            $table->string('name');
            $table->string('email');
            $table->string('address');
        });
    }

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

Enter fullscreen mode Exit fullscreen mode

Produtcs

Novamente no terminal, digitaremos o seguinte comando:

php artisan make:migration create_products_table
Enter fullscreen mode Exit fullscreen mode

No meu caso, o arquivo terá este nome...

\database\migrations\2022_09_29_215336_create_products_table.php

...e o conteúdo substituído pelo mostrado a seguir:

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->foreignId('shop_id')->constrained();
            $table->string('description');
            $table->decimal('price', 8, 2);
        });
    }

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

Enter fullscreen mode Exit fullscreen mode

Invoices

Mais uma vez no terminal...

php artisan make:migration create_invoices_table
Enter fullscreen mode Exit fullscreen mode

...gerando este arquivo...

\database\migrations\2022_09_29_215415_create_invoices_table.php

...e como deve ficar seu conteúdo:

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invoices', function (Blueprint $table) {
            $table->id();
            $table->date('issue_date');
            $table->foreignId('customer_id')->constrained();
            $table->foreignId('shop_id')->constrained();
            $table->string('delivery_address');
            $table->string('delivery_city');
            $table->string('delivery_country');
            $table->string('delivery_post_code');
        });
    }

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

Enter fullscreen mode Exit fullscreen mode

Invoice items

Por fim, a última migração...

php artisan make:migration create_invoice_items_table
Enter fullscreen mode Exit fullscreen mode

...recebendo este nome de arquivo...

\database\migrations\2022_09_29_215449_create_invoice_items_table.php

...e este conteúdo:

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invoice_items', function (Blueprint $table) {
            $table->id();
            $table->foreignId('invoice_id')->constrained();
            $table->foreignId('product_id')->constrained();
            $table->smallInteger('amount');
            $table->decimal('value', 8, 2);
            $table->decimal('tax', 8, 2);
        });
    }

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

Enter fullscreen mode Exit fullscreen mode

Conclusão

Nesta parte do artigo criamos as migrações implementando o relacionamento entre as tabelas, que foi feito através da instrução $table->foreignId('<coluna>')->constrained();.

Para efeitos didáticos, vou exemplificar o relacionamento que existe entre a loja e um produto.

Primeiro, criamos uma chave primária na tabela de lojas com o comando $table->id();.

Em seguida, criamos a chave estrangeira na tabela de produtos com o comando $table->foreignId('shop_id')->constrained();.

Ao executarmos a migração, o Laravel se encarregará de criar os relacionamentos corretamente no banco de dados configurado.

Fácil, não?!😉


Por enquanto é isso.

Até a próxima parte.
😎

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay