【发布时间】:2016-01-19 18:38:59
【问题描述】:
如何使用created_at 字段仅获取今天创建的记录,而不获取其他日期或时间?
我在考虑->where('created_at', '>=', Carbon::now()),但我不确定这是否可行。
【问题讨论】:
标签: mysql date activerecord where laravel-5.1
如何使用created_at 字段仅获取今天创建的记录,而不获取其他日期或时间?
我在考虑->where('created_at', '>=', Carbon::now()),但我不确定这是否可行。
【问题讨论】:
标签: mysql date activerecord where laravel-5.1
对于 Laravel 5.6+ 的用户,你可以这样做
$posts = Post::whereDate('created_at', Carbon::today())->get();
【讨论】:
Post::whereDate('created_at', '=', Carbon::today())
使用Mysql默认CURDATE函数获取当天的所有记录。
$records = DB::table('users')->select(DB::raw('*'))
->whereRaw('Date(created_at) = CURDATE()')->get();
dd($record);
注意
Carbon::now 与 Carbon::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"
【讨论】:
$users = User::whereDate('created_at', DB::raw('CURDATE()'))->get();也对我有用。
如果你在 Laravel 中使用 Carbon(你应该这样做,它很棒!),你可以简单地执行以下操作:
->where('created_at', '>=', Carbon::today())
除了now() 和today(),您还可以使用yesterday() 和tomorrow(),然后使用以下内容:
startOfDay()/endOfDay()
startOfWeek()/endOfWeek()
startOfMonth()/endOfMonth()
startOfYear()/endOfYear()
startOfDecade()/endOfDecade()
startOfCentury()/endOfCentury()
【讨论】:
含碳:
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'); 好整洁
你可以使用
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
不需要使用Carbon::today,因为 laravel 使用 function now() 而不是作为辅助函数
因此,要获取今天创建的任何记录,您可以使用以下代码:
Model::whereDay('created_at', now()->day)->get();
您需要使用whereDate,因此 created_at 将被转换为日期。
【讨论】:
whereDay 只会检查一个月的某一天,每个月至少有 28 天。
$today = Carbon\Carbon::now()->format('Y-m-d').'%';
->where('created_at', 'like', $today);
希望对你有帮助
【讨论】:
简单的解决方案:
->where('created_at', 'like', date("Y-m-d")."%");
【讨论】:
出于可读性目的,我使用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 : select * from "my_models" where "created_at" >= ?
Bindings : ["2019-10-22T00:00:00.000000Z"]
【讨论】:
以下代码对我有用
$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();
【讨论】:
我见过有人用原始查询来做这件事,像这样:
$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'));
【讨论】:
Carbon::today() 将返回类似这样的内容:2021-08-06T00:00:00.000000Z,因此使用 Model::where('created_at', Carbon::today()) 将仅返回在当前日期的凌晨 12:00 创建的记录。
改用Model::where('created_at', '>=', Carbon::today())
【讨论】:
$records = User::where('created_at' = CURDATE())->GET()); 打印($记录);
【讨论】: