如果我有一个名为User
的Laravel 5.5模型hasMany
Post
和Post
hasMany
Hit
s,那么是否存在聚合函数我可以调用以获取所有Hit
中User
的{{1}}总数,其中Post
是在上周创建的?
除了做
这样的事情之外,似乎还有一种聪明的方法可以做到这一点Hit
然后循环查看这些匹配以检查创建日期。
在这种情况下,似乎原始的sql会更好,但我认为可能有一种雄辩的方式来处理这样的情况。
答案 0 :(得分:1)
我认为正确的解决方案就是使用HasManyThrough
关系抓取所有Hit
行,通过posts
表加入。
所以它在User
模型(大致)上看起来像这样:
return $this->hasManyThrough(
Hit::class,
Post::class
// if you have non-standard key names you can specify them here-- see docs
);
然后当您拥有User
模型时,您只需致电$user->hits
即可通过所有用户Post
答案 1 :(得分:0)
您可以将以下代码添加到Post
模型中。
protected static function boot()
{
parent::boot();
static::addGlobalScope('hitCount', function ($builder) {
$builder->withCount('hits');
});
}
每当您提取帖子时,它都会自动提供字段hits_count
。
$post = Post::first();
$hits = $post->hits_count; //Count hits that belongs to this post
您可以阅读文档here,根据需要对其进行自定义。
答案 2 :(得分:0)
在HasManyThrough
模型中设置User
关系:
public function hits()
{
return $this->hasManyThrough('App\Models\Hits','App\Models\Posts','user_id','post_id','id');
}
然后你可以这样做:
$reults = $user->hits()->where('hits_table_name.created_at', '>=', Carbon::today()->subWeek())->count();
使用DB::enableQueryLog();
和DB::getQueryLog();
查看执行的SQL查询是否正确;