DEV Community

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

Posted on

Database Seed - MarketPlace - #3

Esta parte será dedicada à criação dos modelos do nosso projeto e em aplicações Laravel, modelos (model) estendem de Illuminate\Database\Eloquent\Model.

Algumas das características implementadas nesta parte, como relacionamento entre os modelos, por exemplo, podem ser vistas neste artigo.

Se preferir, poderá acessar a documentação oficial do Eloquent ORM através deste link.

Sem mais delongas, vamos ao código. 😉


Modelo

Criaremos os modelos de forma semelhante às migrações, executando o comando no terminal e editando a classe em seguida.

Nesta parte a ordem de criação dos modelos não afetará nenhum aspecto relevante do projeto.


Customer

O primeiro modelo que criaremos será o de clientes.

Acessando o terminal de sua preferência digite o seguinte comando:

php artisan make:model Customer

Assim que o comando for executado, você notará a criação de um arquivo na pasta \App\Models.

Diferentemente das migrações o nome do arquivo será exatamente o que foi informado no comando que executamos no terminal, ficando com este nome: \App\Models\Customer.php.

Agora, utilizando o editor de código de sua preferência altere o código no arquivo recém-criado para que fique exatamente igual ao que está abaixo:

<?php

namespace App\Models;

use App\Models\User;
use App\Models\Invoice;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Customer extends Model
{
    use HasFactory;

    protected $fillable = [
        'last_name',
        'first_name',
        'email',
        'phone',
        'street',
        'city',
        'building_number',
        'country',
        'post_code',
    ];

    public $timestamps = false;

    protected $hidden = [
        'user_id'
    ];

    public function invoices()
    {
        return $this->hasMany(Invoice::class);
    }

    public function user()
    {
        return $this->hasOne(User::class);
    }
}

Enter fullscreen mode Exit fullscreen mode

O modelo que acabamos de criar possui algumas características estendidas da classe abstrata Illuminate\Database\Eloquent\Model.

Para facilitar a compreensão vou listá-las adicionando uma breve descrição e um link com maiores detalhes.

A primeira característica que podemos verificar no modelo, é o atributo protegido $fillable, responsável por configurar a inserção em massa. Detalhes acerca deste atributo podem ser encontrados aqui.


Em seguida temos o atributo público $timestamps cuja finalidade é indicar ao Eloquent se o modelo fará ou não o controle das datas de criação e alteração do modelo no banco de dados. Detalhes sobre este atributo estão aqui.


E para finalizar este modelo, temos dois métodos identificados como invoices() e user(), responsáveis por criar relacionamentos um pra muitos e um pra um, respectivamente.

Os dois tipos de relacionamento são explicados aqui e aqui.


Shop

Vamos novamente acessar o terminal e digitar o seguinte:

php artisan make:model Shop

Após a execução do comando vamos editar a classe para que fique igual ao mostrado a seguir:

<?php

namespace App\Models;

use App\Models\User;
use App\Models\Invoice;
use App\Models\Product;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Shop extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'email',
        'address',
    ];

    protected $hidden = [
        'user_id',
        'id',
    ];

    public $timestamps = false;

    public function invoices()
    {
        return $this->hasMany(Invoice::class);
    }

    public function products()
    {
        return $this->hasMany(Product::class);
    }

    public function user()
    {
        return $this->hasOne(User::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Este modelo é bem semelhante ao da loja, inclusive no que diz respeito aos métodos para resolver os relacionamentos entre os modelos.


Product

Retornando ao terminal criaremos o modelo de produtos, digitando o seguinte:

php artisan:make model Product

E a classe deverá ser modificada, ficando como mostrado abaixo:

<?php

namespace App\Models;

use App\Models\Shop;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Product extends Model
{
    use HasFactory;

    protected $fillable = [
        'description',
        'price',
    ];

    protected $hidden = [
        'shop_id',
        'created_at',
        'updated_at',
    ];

    public function shop()
    {
        return $this->belongsTo(Shop::class);
    }
}

Enter fullscreen mode Exit fullscreen mode

A novidade neste modelo fica a cargo inclusão da chave estrangeira, através do método shop(). Sobre este tipo de relacionamento há detalhes aqui.


Invoice

Voltando ao terminal vamos criar o modelo de notas. Para isso, digite o seguinte comando:

php artisan make:model Invoice

Em seguida, utilizando o editor de código vamos deixar a classe recém-criada de acordo com o exemplo a seguir:

<?php

namespace App\Models;

use App\Models\User;
use App\Models\Invoice;
use App\Models\Product;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class Shop extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'email',
        'address',
    ];

    protected $hidden = [
        'user_id',
        'id',
    ];

    public $timestamps = false;

    public function invoices()
    {
        return $this->hasMany(Invoice::class);
    }

    public function products()
    {
        return $this->hasMany(Product::class);
    }

    public function user()
    {
        return $this->hasOne(User::class);
    }
}

Enter fullscreen mode Exit fullscreen mode

Mesmo sendo o modelo que mais possui relacionamentos no nosso projeto, não há nada de novo. Os métodos responsáveis por resolver o relacionamento entre os modelos foram vistos nos modelos anteriormente listados.


InvoiceItems

Chegamos ao último modelo que representará os itens de uma nota fiscal.

Acessando novamente o terminal, digite o seguinte comando:

php artisan make:model InvoiceItems

Assim que o processo estiver concluído, edite a classe recém-criada para se parecer com o que temos a seguir:

<?php

namespace App\Models;

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

class InvoiceItem extends Model
{
    use HasFactory;

    protected $fillable = [        
        'description',
        'amount',
        'value',
        'tax',
    ];

    public $timestamps = false;
}

Enter fullscreen mode Exit fullscreen mode

Conclusão

Nesta parte criamos os modelos e os relacionamentos entre as entidades.

Na próxima parte veremos a implementação das classes responsáveis por fazer a mágica acontecer, criando e persistindo dados fictícios.

Até breve. 😎

Oldest comments (0)