【问题标题】:Get only records created today in laravel仅获取今天在 laravel 中创建的记录
【发布时间】:2016-01-19 18:38:59
【问题描述】:

如何使用created_at 字段仅获取今天创建的记录,而不获取其他日期或时间?

我在考虑->where('created_at', '>=', Carbon::now()),但我不确定这是否可行。

【问题讨论】:

    标签: mysql date activerecord where laravel-5.1


    【解决方案1】:

    对于 Laravel 5.6+ 的用户,你可以这样做

    $posts = Post::whereDate('created_at', Carbon::today())->get();
    

    【讨论】:

    • 不知道@Ifnot,我从我的应用程序中粘贴了那个sn-p :)
    • 响应的问题是这假设数据库和服务器使用相同的时区。虽然时间戳是从服务器设置的,所以不是问题。
    • 我得到了一个错误 whereData 缺少参数 3,尽管我仍然在旧版本的 laravel 上。如果您收到该错误,只需在两个日期之间添加一个“=”。 Post::whereDate('created_at', '=', Carbon::today())
    • 检查 User::whereDate('created_at', Carbon::today())->get() 但它转错了记录
    【解决方案2】:

    使用Mysql默认CURDATE函数获取当天的所有记录。

        $records = DB::table('users')->select(DB::raw('*'))
                      ->whereRaw('Date(created_at) = CURDATE()')->get();
        dd($record);
    

    注意

    Carbon::nowCarbon::today 之间的区别只是时间。

    例如

    通过Carbon::now 打印的日期看起来像这样:

    2018-06-26 07:39:10.804786 UTC (+00:00)

    Carbon::today:

    2018-06-26 00:00:00.0 UTC (+00:00)

    要获取今天使用now 创建的唯一记录,可以获取如下:

    Post::whereDate('created_at', Carbon::now()->format('m/d/Y'))->get();

    today

    Post::whereDate('created_at', Carbon::today())->get();

    更新

    从 laravel 5.3 开始,我们有默认的 where 子句 whereDate / whereMonth / whereDay / whereYear

    $users = User::whereDate('created_at', DB::raw('CURDATE()'))->get();
    

    或与DB 外观

    $users = DB::table('users')->whereDate('created_at', DB::raw('CURDATE()'))->get();
    

    上面列出的where子句的用法

    $users = User::whereMonth('created_at', date('m'))->get();
    //or you could also just use $carbon = \Carbon\Carbon::now(); $carbon->month;
    //select * from `users` where month(`created_at`) = "04"
    $users = User::whereDay('created_at', date('d'))->get();
    //or you could also just use $carbon = \Carbon\Carbon::now(); $carbon->day;
    //select * from `users` where day(`created_at`) = "03"
    $users = User::whereYear('created_at', date('Y'))->get();
    //or you could also just use $carbon = \Carbon\Carbon::now(); $carbon->year;
    //select * from `users` where year(`created_at`) = "2017"
    

    Query Builder Docs

    【讨论】:

    • 这得到昨天和今天加上明天。
    • @BasheerAhmed 您编辑的代码与我的答案相同。 ;)
    • @SandyandiN.delaCruz 但我在你的版本之前编辑过.. 检查时间:p
    • @BasheerAhmed 我的已于 2015 年 10 月 21 日 16:50 发布,您的已于 15 年 10 月 22 日 16:38 编辑。我不认为我们在这里有相同的日期和时间概念。无论如何,没什么大不了的,伙计。 :)
    • 谢谢兄弟,这个代码$users = User::whereDate('created_at', DB::raw('CURDATE()'))->get();也对我有用。
    【解决方案3】:

    如果你在 Laravel 中使用 Carbon(你应该这样做,它很棒!),你可以简单地执行以下操作:

    ->where('created_at', '>=', Carbon::today())
    

    除了now()today(),您还可以使用yesterday()tomorrow(),然后使用以下内容:

    • startOfDay()/endOfDay()
    • startOfWeek()/endOfWeek()
    • startOfMonth()/endOfMonth()
    • startOfYear()/endOfYear()
    • startOfDecade()/endOfDecade()
    • startOfCentury()/endOfCentury()

    【讨论】:

    • 这也将检索明天、后天等的记录。它大于等于,不是吗?
    • 是的,确实如此。我一定是这么说的,因为在原始问题中就是这样
    • 这意味着这个答案实际上并没有回答问题,对吧?因为 OP 专门要求今天而不是其他日子。
    【解决方案4】:

    含碳:

    return $model->where('created_at', '>=', \Carbon::today()->toDateString());
    

    不含碳:

    return $model->where('created_at', '>=', date('Y-m-d').' 00:00:00');
    

    【讨论】:

    • 我使用第二个选项为今天发生的所有约会创建范围。
    • return $model->where('created_at', '>=', date('Y-m-d').' 00:00:00'); 好整洁
    【解决方案5】:

    你可以使用

    whereRaw('date(created_at) = curdate()')
    

    如果时区不是问题或

    whereRaw('date(created_at) = ?', [Carbon::now()->format('Y-m-d')] )
    

    否则。

    由于created_at字段是时间戳,所以只需要获取其中的日期部分,忽略时间部分。

    【讨论】:

    • Argument 2 passed to Illuminate\Database\Query\Builder::whereRaw() must be of the type array, string given
    【解决方案6】:

    不需要使用Carbon::today,因为 laravel 使用 function now() 而不是作为辅助函数

    因此,要获取今天创建的任何记录,您可以使用以下代码:

    Model::whereDay('created_at', now()->day)->get();
    

    您需要使用whereDate,因此 created_at 将被转换为日期。

    【讨论】:

    • 这个答案来自 SO 中的Low Quality posts,因为它只是一个代码答案。您能否为您的答案添加一些解释?解释你的逻辑,并对你的代码打算做什么做一点评论。不仅对 OP 有所帮助,而且还可以作为未来用户的评论。
    • 谢谢兄弟们的指教。我真的很感激
    • whereDay 只会检查一个月的某一天,每个月至少有 28 天。
    【解决方案7】:
    $today = Carbon\Carbon::now()->format('Y-m-d').'%';
    ->where('created_at', 'like', $today);
    

    希望对你有帮助

    【讨论】:

      【解决方案8】:

      简单的解决方案:

      ->where('created_at', 'like', date("Y-m-d")."%");
      

      【讨论】:

        【解决方案9】:

        Laravel ^5.6 - 查询范围

        出于可读性目的,我使用query scope,使我的代码更具声明性。

        范围查询

        namespace App\Models;
        
        use Illuminate\Support\Carbon;
        use Illuminate\Database\Eloquent\Model;
        
        class MyModel extends Model
        {
            // ...
        
            /**
             * Scope a query to only include today's entries.
             *
             * @param  \Illuminate\Database\Eloquent\Builder  $query
             * @return \Illuminate\Database\Eloquent\Builder
             */
            public function scopeCreatedToday($query)
            {
                return $query->where('created_at', '>=', Carbon::today());
            }
        
            // ...
        }
        

        使用示例

        MyModel::createdToday()->get()
        

        SQL 生成

        Sql      : select * from "my_models" where "created_at" >= ?
        
        Bindings : ["2019-10-22T00:00:00.000000Z"]
        

        【讨论】:

          【解决方案10】:

          以下代码对我有用

            $today_start = Carbon::now()->format('Y-m-d 00:00:00');
                  $today_end = Carbon::now()->format('Y-m-d 23:59:59');
          
                  $start_activity = MarketingActivity::whereBetween('created_at', [$today_start, $today_end])
                                      ->orderBy('id', 'ASC')->limit(1)->get();
          

          【讨论】:

            【解决方案11】:

            我见过有人用原始查询来做这件事,像这样:

            $q->where(DB::raw("DATE(created_at) = '".date('Y-m-d')."'"));
            

            或者没有按日期时间的原始查询,如下所示:

            $q->where('created_at', '>=', date('Y-m-d').' 00:00:00'));
            

            幸运的是,Laravel Query Builder 提供了一个更 Eloquent 的解决方案:

            $q->whereDate('created_at', '=', date('Y-m-d'));
            

            或者,当然,您可以使用Carbon 代替 PHP date():

            $q->whereDate('created_at', '=', Carbon::today()->toDateString());
            

            不仅仅是 whereDate。还有三个更有用的函数可以过滤掉日期:

            $q->whereDay('created_at', '=', date('d'));
            $q->whereMonth('created_at', '=', date('m'));
            $q->whereYear('created_at', '=', date('Y'));
            

            【讨论】:

            【解决方案12】:

            Carbon::today() 将返回类似这样的内容:2021-08-06T00:00:00.000000Z,因此使用 Model::where('created_at', Carbon::today()) 将仅返回在当前日期的凌晨 12:00 创建的记录。

            改用Model::where('created_at', '>=', Carbon::today())

            【讨论】:

              【解决方案13】:

              $records = User::where('created_at' = CURDATE())->GET()); 打印($记录);

              【讨论】:

              • 虽然此代码可能会回答问题,但提供有关其解决问题的方式和/或原因的附加上下文将提高​​答案的长期价值。Read this
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-11-18
              • 1970-01-01
              • 2020-04-12
              • 1970-01-01
              • 2014-02-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多