Date being recorded wrong in bank m-d-Y instead of Y-m-d

3

I set the date format for viewing to "d-m-Y", while the recording format is the "Y-m-d" bank.

However at the time of recording in the bank, something happens and the data is going in the format "mdY", and with that the data will be truncated, especially if the day is greater than 12, then the date goes to 31-12- 1969 automatically and that date is recorded in the bank.

Laravel 4.1 is installed, and the database is MySql.

Here are the codes:

controller

public function getEdit($id) {

    $despesa = Despesas::find($id);
    $despesa->valor = str_replace('.', ',', $despesa->valor);

    $despesasOrigem = array('' => 'Selecione...') + DespesasOrigem::lists('descricao', 'id');
    $despesasTipos = array('' => 'Selecione...') + DespesasTipo::lists('descricao', 'id');

    return View::make('despesas.despesasEdit')
        ->with('despesa', $despesa)
        ->with('despesas_tipo_id', $despesasTipos)
        ->with('despesas_origem_id', $despesasOrigem);
}

public function postEdit() {

    $dados = Input::all();

    $dados['data'] = date('Y/m/d', strtotime($dados['data']));
    $dados['users_id'] = Auth::User()->id;

    $valida = Validator::make($dados, Despesas::$rules);

    if ($valida->fails()) {

        return Redirect::to('despesas/edit' . Input::get('id') )->withInput()->withErrors($valida);

    } else {

        $despesa = Despesas::find(Input::get('id'));
        $despesa->descricao = $dados['descricao'] ;
        $despesa->data = $dados['data'] ;
        $despesa->valor = $str_replace(',', '.', $dados['valor']);
        $despesa->users_id = $dados['users_id'] ;
        $despesa->despesas_tipo_id = $dados['despesas_tipo_id'] ;
        $despesa->despesas_origem_id = $dados['despesas_origem_id'] ;

        $despesa->save();

        $despesa = Despesas::find($despesa->id);
        $despesasOrigem = array('' => 'Selecione...') + DespesasOrigem::lists('descricao', 'id');
        $despesasTipos = array('' => 'Selecione...') + DespesasTipo::lists('descricao', 'id');

        return View::make('despesas.despesasEdit')
            ->with('despesa', $despesa)
            ->with('despesas_tipo_id', $despesasTipos)
            ->with('despesas_origem_id', $despesasOrigem)
            ->with('sucesso', 'Despesa atualizada com sucesso!');

    }
}

view

@extends('templates.master')

@section('conteudo')

<h2>Editar Despesa</h2>

@if(isset($sucesso))
  {{ Alert::success($sucesso) }}
@endif

{{ Form::open() }}

  {{ Form::hidden('id', $despesa->id) }}

  {{ Form::label('Descrição') }}
  {{ Form::input('text', 'descricao', $despesa->descricao) }}
  @if($errors->first('descricao') != null)
    {{ Alert::warning($errors->first('descricao', 'O campo descrição é obrigatorio.'))}}
  @endif

  {{ Form::label('Valor') }}
  {{ Form::input('text', 'valor', $despesa->valor) }}
  @if($errors->first('valor') != null)
    {{ Alert::warning($errors->first('valor', 'O campo valor é obrigatório'))}}
  @endif

  {{ Form::label('Data da despesa') }}
  {{ Form::input('text', 'data', date('d/m/Y', strtotime($despesa->data))) }}    
  @if($errors->first('data') != null)
    {{ Alert::warning($errors->first('data', 'O campo data é obrigatório'))}}
  @endif

  {{ Form::label('despesas_tipo_id', 'Tipo:') }}
  {{ Form::select('despesas_tipo_id', $despesas_tipo_id, $despesa->despesas_tipo_id) }}
  @if($errors->first('despesas_tipo_id') != null)
    {{ Alert::warning($errors->first('despesas_tipo_id', 'O campo Tipo de Despesa é obrigatório'))}}
  @endif

  {{ Form::label('despesas_origem_id', 'Origem:') }}
  {{ Form::select('despesas_origem_id', $despesas_origem_id, $despesa->despesas_origem_id) }}
  @if($errors->first('despesas_origem_id') != null)
    {{ Alert::warning($errors->first('despesas_origem_id', 'O campo Origem da Despesa é obrigatório'))}}
  @endif

  {{ Form::submit('Enviar')}}

{{ Form::close() }}

@stop

route

Route::controller('despesas', 'DespesasController');

models

<?php

class Despesas extends Eloquent {

    protected $table = "despesas";

    protected $softDelete = true;

    /**
     * Regras de validação da table despesas 
     *
     * @return array
     */
    public static $rules = array (
        'descricao'             => 'required',
        'valor'                 => 'required|numeric',
        'data'                  => 'required|date',
        'despesas_tipo_id'      => 'required',
        'despesas_origem_id'    => 'required',
        'users_id'              => 'required'
        );

     protected $guarded = array('id');


    public function despesasTipo()
    {
        return $this->belongsTo('DespesasTipo','despesas_tipo_id');
    }

    public function despesasOrigem()
    {
        return $this->belongsTo('DespesasOrigem','despesas_origem_id');
    }

    public function user()
    {
        return $this->belongsTo('User','users_id');
    }

}
    
asked by anonymous 22.12.2013 / 23:37

2 answers

7

In your controller , in the postEdit() method, change this line:

$dados['data'] = date('Y/m/d', strtotime($dados['data']));

For this:

$dados['data'] = DateTime::createFromFormat('d/m/Y', $dados['data'])->format('Y-m-d');


In your view , you could also use the DateTime class. Instead of:

{{ Form::input('text', 'data', date('d/m/Y', strtotime($despesa->data))) }}

You could use:

{{ Form::input('text', 'data', with(new DateTime($despesa->data))->format('d/m/Y') }}

Even better than this, you can define in your model the fields that will be treated as a date, through the $dates protected property, so that the fields listed there will extend the Carbon object , which allows you to use the format() method directly:

class Despesas extends Eloquent
{
    /* ... */

    protected $dates = array('data');

    /* ... */
}

Doing this, in your view , the presentation looks like this:

{{ Form::input('text', 'data', $despesa->data->format('d/m/Y') }}
    
22.12.2013 / 23:51
0

I have used the "date" attribute of HTML5 which 2 advantages:

  • You do not need to convert to display on screen since HTML5 does automatic.
  • Brings a calendar for the user to choose the date using the mouse.
  • In this case suffice:

    {{ Form::input('date', 'data', $despesa->data) }}
    

    Simple like this!

        
    23.12.2013 / 18:58