Laravel如何查询时间戳等于日期的数据透视表

时间:2018-10-25 00:17:39

标签: laravel laravel-5 eloquent

我有用户和习惯,还有一个habit_user表可以将它们加入。

我这样查询:

$track = $h->userAnswers()->where('user_id', Auth::user()->id)->wherePivot('created_at', '=', Carbon\Carbon::now()->subDays($i))->first();

此循环正在循环运行,该循环可以追溯7天。在数据库中创建了一条记录_at:2018-10-23 04:48:44

在我的习惯模型中,我有您所期望的方法:

public function userAnswers()
{
    return $this->belongsToMany('App\Habit', 'habit_user_answers')->withTimestamps()->withPivot('answer_one', 'created_at')->orderBy('pivot_created_at', 'desc');

}

为什么查询不会获得记录?

3 个答案:

答案 0 :(得分:0)

您正在比较日期时间,因此仅当日期和时间相同时,查询才会引发结果。

您可以像这样比较日期:

wherePivot('created_at', '>=', Carbon\Carbon::now()->subDays($i)->startOfDay())->wherePivot('created_at', '<=', Carbon\Carbon::now()->subDays($i)->endOfDay())

答案 1 :(得分:0)

您的wherePivot()方法正在对该日期进行等于=)比较,这将您的结果限制为created_at的记录恰好 $i天前,到第二天。

如果相反,您想将查询限制为{em> {em> created_at天不超过$i的记录,请使用>=进行比较:

... ->wherePivot('created_at', '>=', now()->subDays($i)) ...

如果直到$n天之前的每一天中都需要一个结果,那么Paras提供的解决方案应该对您有用。

答案 2 :(得分:0)

首先,我认为您需要考虑有关命名方法和属性的Laravel约定。

我将根据您的结构(包括用户和习惯)假设以下内容。因此,我们有一个User模型和一个Habit模型,一个用户belongsToMany habits和一个习惯belongsToMany users。数据透视表habit_user还包含answer_oneanswer_created_at和时间戳等额外字段。

如果您现在要查询习惯,则有两种解决方法:

1-使用wherePivot()

auth()->user()->habits()->wherePivot('answer_created_at', today())->get();
auth()->user()->habits()->wherePivot('answer_one', '!=', 'something')->get();

2-使用whereHas()

auth()->user()->whereHas('habits', function($query){
    $query->where('pivot.answer_one', 'something');
})->get();