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