我有用户和习惯,还有一个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');
}
为什么查询不会获得记录?
答案 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_one
,answer_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();