我如何过滤年和月类型的时间戳的属性在数据库与laravel


how can I filter by year and moth an atribute of type timestamp in the DB with laravel?

我试图按年和月过滤"技术"的"服务",为此,我得到一个ID来查找"技术"。所有这些都是通过嵌套查询完成的. 我的问题是我不知道如何过滤年和月的同一时间与laravel我的代码:

控制器

    public function doFilter(){
    $servicios = Tecnico::find(Input::get('id'))
                ->servicios //services
                ->where('timestamp', Input::get('ano').'-'.Input::get('mes'));// ano=year, mes=moth
    return View::make('detalletecnico', array('servicios' => $servicios, 'id' => Input::get('id')));            
    }

TechnicalModel

class Tecnico extends Eloquent{
protected $table = 'Tecnico';
protected $primaryKey = 'idTecnico';
protected $hidden = array('Contrasena');
protected $fillable = array(
                            'idTecnico',
                            'Nombre',
                            'Apellido',
                            'Telefono',
                            'Contrasena',
                            'Foto',
                            );
public function servicios(){
    return $this->belongsToMany('Servicio', 'Servicio_Tecnico', 'Tecnico_idTecnico', 'Servicio_idServicio');
}
}

ServiceModel

class Servicio extends Eloquent{
protected $table = 'Servicio';
protected $primaryKey = 'idServicio';
protected $fillable = array(
                            'Direccion',
                            'RutaPDF',
                            'Completado',
                            'timestamp'
                            );
public function materialUsado(){
    return $this->hasMany('Material_Usado', 'idMaterial_Usado');
}
public function tecnicos(){
    return $this->belongsToMany('Tecnico', 'Servicio_Tecnico', 'Servicio_idServicio', 'Tecnico_idTecnico');
}
}

Route::get('tecnico/detalle/filter', array('uses' => 'TecnicoController@doFilter'));
叶片

            {{Form::open(array('url' => 'tecnico/detalle/filter'))}}
        {{Form::select('mes', array('Enero', 
                                        'Febrero', 
                                        'Marzo', 
                                        'Abril', 
                                        'Mayo', 
                                        'Junio',
                                        'Julio',
                                        'Agosto',
                                        'Septiembre',
                                        'Octubre',
                                        'Noviembre',
                                        'Diciembre'), array('class' => 'input-xlarge'))}}
        {{Form::select('ano', array(date('Y'),
                                    '2013', 
                                    '2012' 
                                    ), array('class' => 'input-xlarge'))}}
        {{ Form::hidden('id', $id) }}                       
        {{ Form::submit('Filtrar', array('class' => 'btn btn-primary')) }}  
        {{Form::close()}}

您可以尝试使用MySql中的raw where和YEAR和MONTH函数:

$servicios = Tecnico::find(Input::get('id'))
            ->servicios()
            ->whereRaw('YEAR(timestamp) = ?', array(Input::get('ano')))
            ->whereRaw('MONTH(timestamp) = ?', array(Input::get('mes')))
            ->get();

如果我说对了,那么这就是你想要的:

$servicios = Tecnico::find(Input::get('id'))
                ->servicios()
                ->where('timestamp', 'like', Input::get('ano').'-'.Input::get('mes'))
                ->get();

当然,select中的months数组必须以数字作为键,如下所示:

array('01' => 'Enero, '02' => 'Febrero' ...)

使用日期范围进行筛选:

public function doFilter()
{
    $inicio = 'Carbon'Carbon::createFromDate(Input::get('ano'), Input::get('mes'), 1);
    $fim = $start->copy()->lastOfMonth()->hour(23)->minute(59)->second(59);
    $servicios = Tecnico::find(Input::get('id'))
                ->servicios()
                ->where('timestamp', '>=' $inicio)
                ->where('timestamp', '<=' $fim)
                ->get();
   return View::make('detalletecnico', array('servicios' => $servicios, 'id' => Input::get('id')));            
}