用聚合调用Laravel关系

时间:2018-01-27 17:32:21

标签: php laravel laravel-5 eloquent

如果我有一个名为User的Laravel 5.5模型hasMany PostPost hasMany Hit s,那么是否存在聚合函数我可以调用以获取所有HitUser的{​​{1}}总数,其中Post是在上周创建的?

除了做

这样的事情之外,似乎还有一种聪明的方法可以做到这一点
Hit

然后循环查看这些匹配以检查创建日期。

在这种情况下,似乎原始的sql会更好,但我认为可能有一种雄辩的方式来处理这样的情况。

3 个答案:

答案 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();

HasManyThrough Link

使用DB::enableQueryLog();DB::getQueryLog();查看执行的SQL查询是否正确;