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. 😎

Top comments (0)

Timeless DEV post...

How to write a kickass README

Arguably the single most important piece of documentation for any open source project is the README. A good README not only informs people what the project does and who it is for but also how they use and contribute to it.

If you write a README without sufficient explanation of what your project does or how people can use it then it pretty much defeats the purpose of being open source as other developers are less likely to engage with or contribute towards it.