Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Dúvida com Mutators

Olá, tenho um Model Movimentacoes e a respectiva tabela movimentacao.

No meu IndeController eu estou pegando do banco uma lista com as movimentacoes existentes:

public function index()
    {
        $aMovimentacoes = Movimentacao::all();
        return view('index.index', array('aMovimentacoes' => $aMovimentacoes));
    }

Porém, a data que vem do DB, vem no formato yyyy-mm-dd e eu quero no formato brasileiro... Então olhando a documentação, vi que pode ser feito um mutator, para já formatar a data para mim, direto no Model. Fiz dessa forma:

class Movimentacao extends Model
{
    protected $table = 'movimentacao';

    public $timestamps = false;
    protected $fillable = array('descricao', 'valor', 'tipo', 'data_vencimento');

    public function getDataNascimentoAttribute($valor)
    {
        $date = substr($this->data_vencimento, 0, 10);
        $date = str_replace('-', '/', $date);
        return date('d/m/Y', strtotime($date));
    }
}

Tanto na minha página Blade quanto no controller já tentei percorrer a minha lista e chamar $movimentacao->data_vencimento, porém ele nunca nem sequer entra lá no Mutator... Já tentei com debug e com die, mas de qualquer forma, não chama lá no Model.

Como posso fazer isso?

4 respostas

Mutators são muito interessantes e úteis em muitos casos, mas para o caso de datas você poderia simplesmente usar

class Movimentacao extends Model
{
    protected $table = 'movimentacao';

    public $timestamps = false;
    protected $fillable = array('descricao', 'valor', 'tipo', 'data_vencimento');

    protected $dates = [
        'data_vencimento'
    ];
}

Isso vai fazer com que o Laravel encapsule 'data_vencimento' dentro de um objeto Carbon ( Extensão do objeto DateTime nativo do PHP). Com isso, você ganha algumas vantagens, uma delas é poder formatar essa data em qualquer formato desejado.

$movimentacao = App\Movimentacao::find( $um_id_valido );
$movimentacao->data_vencimento->format('d/m/Y');

Ok, mas supondo que eu queira me certificar se a primeira letra do nome do usuário seja maiúscula, usando Mutators?

Pq o meu problema mesmo, é que o mutator não está sendo chamado...

solução!

Da uma olhada no nome da sua variável vs nome do método.

A variável é 'data_vencimento' e o nome do método é 'getDataNascimentoAttribute'

Pra esse método funcionar, tem que ter uma relação direta entre os nomes.

O nome do método não deveria ser 'getDataVencimentoAttribute' ?

Baita burrada minha, era simplesmente erro nos nomes mesmo...

Meu atributo é o data_vencimento e o nome do método estava esperando uma data_nascimento