在Laravel中仅获取今天创建的记录

115

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

我考虑使用 ->where('created_at', '>=', Carbon::now()) 但我不确定它是否有效。


17个回答

270

对于 Laravel 5.6+ 用户,你只需执行以下操作:

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

1
没有问题 @Ifnot,我就是从我的应用程序中复制粘贴了那个片段 :) - ashish
11
回应存在的问题是假定数据库和服务器使用相同的时区。尽管时间戳是从服务器设置的,所以这不是一个真正的问题。 - Oliver Nybroe
1
我遇到了一个错误,whereData缺少第3个参数,尽管我仍然在较旧的版本的laravel上。如果你遇到那个错误,只需要在两个日期之间添加一个'='符号。Post :: whereDate('created_at','=',Carbon :: today()) - Tschallacka
检查 User::whereDate('created_at', Carbon::today())->get(),但它返回了错误的记录。 - Marvin Collins

74

使用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();

更新

从laravel5.3开始,我们有默认的”where”子句:whereDate / whereMonth / whereDay / whereYear

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

使用DB门面进行OR操作

$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"

查询构建器文档


这会获取昨天、今天和明天的数据。 - TheWebs
@BasheerAhmed,你编辑过的代码和我的答案是一样的。;) - Sandyandi N. dela Cruz
@SandyandiN.delaCruz 但在你编辑之前我已经进行了修改...看一下时间 :p - Basheer Kharoti
注意:使用CURDATE(),您将获得由数据库定义的“今天”,即在数据库时区中的当天日期。但是,您的用户可能位于不同的时区,甚至可能位于不同的时间区域。要获取用户所在时区的当前日期,您可以执行类似以下示例的操作:DATE(CONVERT_TZ(NOW(),@@session.time_zone,'Europe/Berlin')),这需要设置MySQL时区表。或者,您可以像下面描述的那样使用Carbon库。 - Christopher K.
@ChristopherK. 这不是问题的一部分。 - Basheer Kharoti
显示剩余2条评论

45

如果你正在使用 Carbon(你应该使用,它非常棒!)和 Laravel,你可以简单地执行以下操作:

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

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

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

1
这也将检索明天、后天等记录。它是大于等于,不是吗? - Silidrone
是的,确实如此。我必须这样做,因为在原始问题中是这样的。 - itainathaniel
1
这意味着这个回答实际上并没有回答问题,对吧?因为OP特别询问今天而不是其他任何一天。 - Silidrone

16

使用碳:

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

无碳:

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

2
我使用了第二个选项来创建一个范围,以涵盖今天发生的所有约会。 - Dylan Glockler
返回 $model->where('created_at', '>=', date('Y-m-d').' 00:00:00'); 这行代码真是整洁。 - Haseeb Zulfiqar

12

您可以使用

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 - TheWebs

5

Laravel ^5.6 - 查询作用域

为了提高可读性,我使用查询作用域,让我的代码更具声明性。

作用域查询

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

    // ...
}

example of usage

MyModel::createdToday()->get()

SQL generated

Sql      : select * from "my_models" where "created_at" >= ?

Bindings : ["2019-10-22T00:00:00.000000Z"]


3
$today = Carbon\Carbon::now()->format('Y-m-d').'%';
->where('created_at', 'like', $today);

希望这能对您有所帮助。


3

不需要使用 Carbon::today,因为 Laravel 使用 now() 函数作为帮助函数。

因此,要获取任何已创建的记录,请使用以下代码:

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

您需要使用 whereDate 函数,这样 created_at 就会被转换为日期。


1
这个答案在SO的低质量帖子中出现,因为它只是一个代码答案。你能否请添加一些解释到你的答案中?解释你的逻辑,并对你的代码意图进行一些评论。这不仅有助于OP,也将作为未来用户的评论。 - dbc
感谢各位兄弟的建议,我非常感激。 - hsul4n
1
whereDay 只会检查一个月中的特定日期,每个月至少有28天。 - Orkhan Alikhanov

2

简单解决方案:

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

2

Laravel 8

 $VisitorEntryStatusDateCurrent = VisitorEntry::whereDate('created_at', Carbon::today())->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接