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)