Forma elegante e eficiente de formatar campos de data, hora e afins, colocando somente um sufixo no nome original do atributo sem precisar declarar Accessors e/ou Mutators dentro da model. Pode facilmente também exibir um somatório usando relacionamento, sem precisar declarar o Accessor, como visto no Uso avançado
composer require gsferro/powermodel
-
Caso de algum Problema por conta da sua versão do php (<8.0.0), execute:
composer require gsferro/powermodel --ignore-platform-reqs
- Na Model adicione a trait do pacote:
Use PowerModel;
# Para fins de demonstração
$model = Model::first();
-
Datas:
- formato de banco para BR
# original $model->created_at // 2021-12-16 12:00:00 # sufixo $model->created_at_fdh // sufixo '_fdh' => 16/12/2021 12:00:00 $model->created_at_dhi // sufixo '_dhi' => 16/12/2021 12:00 $model->created_at_fmt // sufixo '_fmt' => 16/12/2021 $model->created_at_fmr // sufixo '_fmr' => 12:00 $model->created_at_rar // sufixo '_rar' => 12:00:00
-
CPF | CNPJ:
_inc
- Verifica se o valor é um cpf ou cnpj e coloca a mascara de acordo
# original $model->cpf // 12345678900 # sufixo $model->cpf_inc // sufixo '_inc' => 123.456.789-00 # original $model->cnpj // 12345678901234 # sufixo $model->cnpj_inc // sufixo '_inc' => 12.345.678/9012-34 # original $model->cpf_cnpj // 12345678900 | 12345678901234 # sufixo $model->cpf_cnpj_inc // sufixo '_inc' => 123.456.789-00 | 12.345.678/9012-34
-
Valor Monetário:
_mbr
(float)# original $model->valor_unitario // 12345.67 # sufixo $model->valor_unitario_mbr // sufixo '_mbr' => 12.345,67
-
Valor Numerico:
_nbr
(int)# original $model->valor_numerico // 1234567 # sufixo $model->valor_numerico_nbr // sufixo '_nbr' => 1.234.567
-
Email Mascarado:
_msk
# TODO pegar a configuração da mascara do e-mail via config # original $model->email // "fulano@exemplo.com" # sufixo $model->email_msk // sufixo '_msk' => "f*****o@exemplo.com" # Caso o campo não seja um email valido, devolvera o valor original: $model->email // "fulano#exemplo.com" # sufixo $model->email_msk // sufixo '_msk' => "fulano#exemplo.com"
-
Ativo / Inativo:
_sai
- (bool)# original $model->status // "1" # sufixo $model->status_sai // sufixo '_sai' => "Ativo" # original $model->status // "0" # sufixo $model->status_sai // sufixo '_sai' => "inativo"
-
Sim / Não:
_ssn
- (bool)# original $model->status // "1" # sufixo $model->status_ssn // sufixo `_ssn' => "Sim" # original $model->status // "0" # sufixo $model->status_ssn // sufixo '_ssn' => "Não"
-
Habilitado / Desabilitado (enable/disabled):
_sed
- (bool)# original $model->status // "1" # sufixo $model->status_sed // sufixo `_sed' => "Habilitado" # original $model->status // "0" # sufixo $model->status_sed // sufixo '_sed' => "Desabilitado"
-
Sum:
<relationName>_sum_<collumn_name>
# Para fins de demonstração na Model vc tem um Accessors que faz a soma utilizando um relacionamento public function getSumValorTotalEstimadoAttribute(): string { return $this->itens()->sum('valor_total_estimado') ?? 0.00; } # Invocando $model = Model::first(); $model->sum_valor_total_estimado; // 123456.89 $model->sum_valor_total_estimado_mbr; // 1.234.567,89
- Ou você pode simplesmente fazer assim:
# Para fins de demonstração na Model vc tem um relacionamento chamado itens # Invocando $model = Model::first(); $model->itens_sum_valor_total_estimado; // 123456.89 # e ainda utilizar a formatação com o sufixo $model->itens_sum_valor_total_estimado_mbr; // 1.234.567,89
-
Count:
<relationName>_count_relation
# Para fins de demonstração na Model vc tem um Accessors que faz o count utilizando um relacionamento public function getCountItensEstimadoAttribute(): string { return $this->itens()->count() ?? 0; } # Invocando $model = Model::first(); $model->itens_count_relation; // 12345689 $model->itens_count_relation_nbr; // 123.456.789
- Ou você pode simplesmente fazer assim:
# Para fins de demonstração na Model vc tem um relacionamento chamado itens # Invocando $model = Model::first(); $model->itens_count_relation; // 12345689 # e ainda utilizar a formatação com o sufixo $model->count_itens_nbr; // 123.456.789
Caso queria ao invocar a model, já exibir o Accessor, basta colocado no append:
- Usando o exemplo do Uso avançado
- Sem append:
# Tinker
>>> $model = Model::first()
=> {
id: "1",
created_at: "2021-12-10 15:19:20.697",
updated_at: "2021-12-10 15:19:20.697",
}
$model->sum_valor_total_estimado; // 123456.89
$model->sum_valor_total_estimado_mbr; // 1.234.567,89
- Com append na model:
protected $appends = [
'sum_valor_total_estimado',
'sum_valor_total_estimado_mbr',
];
# Tinker
>>> $model = Model::first()
=> {
id: "1",
created_at: "2021-12-10 15:19:20.697",
updated_at: "2021-12-10 15:19:20.697",
+sum_valor_total_estimado: "123456.89",
+sum_valor_total_estimado_mbr: "1.234.567,89",
}
- Com append usando prefixo de relacionamento, sem precisar criar o Accessor:
protected $appends = [
'sum_valor_total_estimado',
'sum_valor_total_estimado_mbr',
'itens_sum_valor_total_estimado',
'itens_sum_valor_total_estimado_mbr',
];
# Tinker
>>> $model = Model::first()
=> {
id: "1",
created_at: "2021-12-10 15:19:20.697",
updated_at: "2021-12-10 15:19:20.697",
+sum_valor_total_estimado: "123456.89",
+sum_valor_total_estimado_mbr: "1.234.567,89",
+itens_sum_valor_total_estimado: "123456.89",
+itens_sum_valor_total_estimado_mbr: "1.234.567,89",
}
```
### TODO
1. No getAttribute
1. Prefixo para soma campo em um relacionamento
1. IP
1. TelCel
1. Implementar para o setAtribute
1. No caso de empty, devolver um valor padrão que esteja dentro de uma config ao inves de somente ""
### Observações Gerais
1. Na versão do laravel 8.77 foi lançada uma nova abordagem para criar os Accessors e Mutators
1. Fique a vontade para enviar pull-request com mais formatações genéricas para facilitar o uso no dia-a-dia
### License
- MIT License