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

Laravel 5 where condition to get pass 30 days worth of records

我在实例 table 中有一个日期列,其 varchar 数据类型存储为 d-m-Y。在我的 where 条件下,我试图仅获取过去 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();

试试这个。 Carbon 有 subDays 函数,你可以通过它获取过去 30 天的数据

$date30DaysBack= Carbon::now()->subDays(30)->format('d-m-Y'); 
$today = Carbon::now()->format('d-m-Y'); 

 $adverts = DB::table('adverts') 
   ->whereBetween(DB::raw('STR_TO_DATE(instances.date,"%d-%m-%Y")'),[$date30DaysBack,$today])->get()

你看过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'))

你试过了吗DATEDIFFmethod

$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();