Database Seed - MarketPlace - #3
Tags: laravel, beginners
Published: 2022-10-26 00:49:10

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](https://dev.to/marciopolicarpo/orm-eloquent-model-361g).

Se preferir, poderá acessar a documentação oficial do Eloquent ORM através [deste link](https://laravel.com/docs/9.x/eloquent).

Sem mais delongas, vamos ao código. :wink:

---

### 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
<?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);
    }
}

```

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](https://dev.to/marciopolicarpo/orm-eloquent-model-361g#inser%C3%A7%C3%A3o-em-massa).

---

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](https://dev.to/marciopolicarpo/orm-eloquent-model-361g#createdat-e-updatedat).

---

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](https://dev.to/marciopolicarpo/orm-eloquent-model-361g#relacionamento-um-pra-um) e [aqui](https://dev.to/marciopolicarpo/orm-eloquent-model-361g#relacionamento-um-pra-muitos).

---

## 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
<?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);
    }
}
```

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
<?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);
    }
}

```

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](https://dev.to/marciopolicarpo/orm-eloquent-model-361g#chave-estrangeira).

---

## 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
<?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);
    }
}

```




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
<?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;
}

```
---

### 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. :sunglasses: