如何用计数完成复杂的Laravel查询

时间:2017-12-06 01:03:46

标签: mysql laravel laravel-5

我的模型关系在半伪代码中看起来像这样(希望它有意义)

Member ->hasMany(Sessions)

Session -> hasMany(Purchases)

Session -> hasMany(PageViews)

购买和PageView belongTo一个sessionsession属于a成员。

我需要编写一个雄辩或原始查询来获取会话数,购买总价值(purchases.cost)以及特定日期内属于每个成员的pageView数量。

示例,2017年12月1日至2017年12月31日期间,会员(id)9999有10个会话,在这10个会话中,他进行了2次购物,总价值为1000美元,他还有20个页面视图。

 Member  |  Sessions  |  Total Value  |  Page Views
---------------------------------------------------
  9999  |    10      |     $1,000    |      20

这甚至可以用雄辩的方式完成吗? 我应该将我的查询基于成员表或会话表吗? 如果我使用会员表,我该如何查询session.created_at

我尝试从一些原始sql开始,并且遇到了会话的计数(Unknown column 'count(sessions.created_at)' in 'field list'),这是我到目前为止所做的事情($dates[]只是一个开始和结束日期:

$this->builder = (DB::table('members')
            ->select('members.member_num as member', 'count(sessions.created_at) as sessionCount')
            ->join('sessions', 'sessions.member_id', '=', 'members.id')
            ->where('sessions.created_at', '>=', $dates[0])
            ->where('sessions.created_at', '<', $dates[1])
            ->orderBy('sessions.created_at', 'desc')
            ->groupBy('sessions.created_at')
            ->groupBy('members.member_num'));

当我尝试这个选择部分时

->select('members.member_num as member', 'sessions.created_at as session_date')

查询有效,但显然我没有得到我正在尝试的会话数。

然后我尝试了这个

->select('members.member_num as member', DB::raw('count(sessions.id) as sessionCount'))

这次我得到一个计数,但只有1,当我希望2使用我的测试数据时。

我认为我也可以使用API​​资源来遍历所有关系,并按照这种方式计算所有内容,但不确定什么是最有效的,或者甚至是可能的。

更新:

这是我目前提出的问题(因为还没有答案,所以必须是一个棘手的问题)

$this->builder = (DB::table('sessions')
            ->join('members', 'sessions.member_id', '=', 'members.id')
            ->select(
                DB::raw('members.member_num as member'), 
                DB::raw('count(sessions.id) as sessionCount'), 
            )
            ->where('sessions.created_at', '>=', $dates[0])
            ->where('sessions.created_at', '<', $dates[1])
            ->groupBy('member'));

好的,这很好 - 第1步有效,它给了我期望的计数值,但是当我开始添加连接和其他列的更多计数时,计数开始相乘,所以使用我的测试数据,上面给出我的会话数量2 - 很好!

当我这样做时,sessionCount变为4(相同的测试数据)!不好!<​​/ p>

$this->builder = (DB::table('sessions')
            ->join('members', 'sessions.member_id', '=', 'members.id')
            ->join('posts', 'sessions.id', '=', 'posts.session_id')
            ->join('purchases', 'sessions.id', '=', 'purchases.session_id')
            ->select(
                DB::raw('members.member_num as member'), 
                DB::raw('count(sessions.id) as sessionCount'),
                DB::raw('count(posts.id) as postCount'),
                DB::raw('sum(purchases.total_cost) as total_value')
            )
            ->where('sessions.created_at', '>=', $dates[0])
            ->where('sessions.created_at', '<', $dates[1])
            ->groupBy('member'));

为什么? :(

0 个答案:

没有答案