我的模型关系在半伪代码中看起来像这样(希望它有意义)
Member ->hasMany(Sessions)
Session -> hasMany(Purchases)
Session -> hasMany(PageViews)
购买和PageView belongTo
一个session
,session
属于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'));
为什么? :(