Laravel Eloquent - 其中created_at是X天前的

时间:2017-10-17 15:24:41

标签: php sql laravel laravel-5 eloquent

我有一系列的日子,我想检查以Laravel Spark结尾的试验:

$trialIntervals = [10, 5, 3, 1, 0];

我获取所有团队,然后使用diffInDays检查他们的trial_ends_at是否与其中一个间隔约会:

$daysTillTrialEnds = Carbon::parse($team->trial_ends_at)->diffInDays(Carbon::now());

然后我检查这个值是否已经是数据库中的现有结果以及间隔:

if ( in_array($daysTillTrialEnds, $trialIntervals) && !TrialEndingNotification::where('team_id', $team->id)->where('days_notified_at', $daysTillTrialEnds)->count() ) {

   // not yet been added to db

}

我有一个名为'days_notified_at'的字段,我正在使用该支票,如果我已经添加了行并通知了客户。但是,该字段永远不会再次使用,我宁愿引用created_at日期并删除该字段。

我的问题是我基本上是这样做的:

->where(Carbon::parse('created_at')->diffInDays(Carbon::now()), $daysTillTrialEnds)

没有收到此错误:

DateTime::__construct(): Failed to parse time string (created_at) at position 0 (c): The timezone could not be found in the database

目标是where只显示具有X天前created_at日期的行。

5 个答案:

答案 0 :(得分:1)

->where(Carbon::parse('created_at')->diffInDays(Carbon::now()), $daysTillTrialEnds)

应该像

->where(Carbon::parse($item->created_at)->diffInDays(Carbon::now()), $daysTillTrialEnds)

答案 1 :(得分:1)

您可以像这样在模型中创建范围:

public function scopeActive($query)
{
    return $query->whereDate('created_at' , '=', Carbon::today()->subDays( 2 ));

}

在控制器中的调用范围之后:

    $post = Post::active()->get();

答案 2 :(得分:0)

你有没有试过像:

$dayAgo = 6 // where here there is your calculation for now How many days
$dayToCheck = Carbon::now()->subDays($dayAgo);
$model->where("created_at", =, $dayToCheck);

答案 3 :(得分:0)

使用WhereRaw

->whereRaw('DATEDIFF(CURDATE(),STR_TO_DATE(created_at, '%Y-%m-%d'))'), $daysTillTrialEnds)

答案 4 :(得分:0)

Laravel会自动将“created_at”变成碳对象,因此您无需解析它。

`$items->where('created_at')->diffInDays(Carbon::now(), $daysTillTrialEnds)'

应该适合你