Laravel 5条件获得通过30天的记录

时间:2016-06-10 10:09:43

标签: laravel date time where-clause php-carbon

我在实例表中有一个日期列,其中varchar数据类型存储为d-m-Y。在我的情况下,我只想获取过去30天的记录。

$backdate = Carbon::parse('-30 days')->toDateString();

$date30DaysBack = Carbon::parse($backdate)->format('d-m-Y'); 

$adverts = DB::table('adverts') 
->where(DB::raw('STR_TO_DATE(instances.date,"%d-%m-%Y")'), '>=',$date30DaysBack)

完整查询

$adverts  = DB::table('adverts')
            ->select(DB::raw('(SELECT IF(ext = \'jpeg\', CONCAT(fullpath, \'_1.\', ext), (CONCAT(fullpath,\'.\',ext))) as fullpath FROM advertsstorage where uid_dir = adverts.ad_uid ORDER BY id ASC limit 1)as fullpath, adverts.*, domains.location,instances.date'))                
            ->join('domains','adverts.domain', '=' ,'domains.domain')
            ->join('advertiser_domains','domains.id', '=' ,'advertiser_domains.domain_id')
            ->join('advertisers','advertiser_domains.advertiser_id', '=' ,'advertisers.u_id')
            ->join('instances','adverts.ad_uid','=','instances.ad_uid')
            ->join('urls','instances.u_id','=','urls.id')
            ->join('sites','urls.sites_id','=','sites.id')     
            ->where('advertisers.u_id', '=',$advertiserID)
            ->where(DB::raw('STR_TO_DATE(instances.date,"%d-%m-%Y")'), '>=',Carbon::now()->subDays(30)->format('d-m-Y'))

            ->orderBy(DB::raw('STR_TO_DATE(instances.date,"%d-%m-%Y")'), 'DESC')

            ->get();

3 个答案:

答案 0 :(得分:1)

您是否尝试过DATEDIFF method

$adverts  = DB::table('adverts')
    ->select(DB::raw('(SELECT IF(ext = \'jpeg\', CONCAT(fullpath, \'_1.\', ext), (CONCAT(fullpath,\'.\',ext))) as fullpath FROM advertsstorage where uid_dir = adverts.ad_uid ORDER BY id ASC limit 1)as fullpath, adverts.*, domains.location,instances.date'))                
    ->join('domains','adverts.domain', '=' ,'domains.domain')
    ->join('advertiser_domains','domains.id', '=' ,'advertiser_domains.domain_id')
    ->join('advertisers','advertiser_domains.advertiser_id', '=' ,'advertisers.u_id')
    ->join('instances','adverts.ad_uid','=','instances.ad_uid')
    ->join('urls','instances.u_id','=','urls.id')
    ->join('sites','urls.sites_id','=','sites.id')     
    ->where('advertisers.u_id', '=',$advertiserID)

    ->where(DB::raw('DATEDIFF( now(), STR_TO_DATE(instances.date,"%d-%m-%Y") )'), '<=', 30)

    ->orderBy(DB::raw('STR_TO_DATE(instances.date,"%d-%m-%Y")'), 'DESC')

    ->get();

答案 1 :(得分:0)

试试这个。 Carbon具有subDays功能,您可以通过该功能获取超过30天的数据

<img src = "image1.*">

答案 2 :(得分:0)

您是否已查看Carbon docs

您可以使用减法修改器; Carbon::now()->subDays(30);

在您的代码中看起来像这样:

$adverts = DB::table('adverts')->where(DB::raw('STR_TO_DATE(instances.date,"%d-%m-%Y")'), '>=', Carbon::now()->subDays(30)->format('d-m-Y'))