我正在创建一个房间预订系统。为了这个问题,我有两个表:user
和group
。它们在Doctrine2中通过多对多关系链接(因此从技术上讲,我有3个表)。
每周,每组允许预订十个小时。作为群组成员的任何人都可以代表该群组进行预订。我希望能够保留用户和组的预订历史记录。所以我们可以说
"2 weeks ago, the "white lions" booked nine and a half hours, but the week before, they only booked 3",
我们也可以说
"Dave has made 75% of the bookings for the white lions in the past two weeks"
理想情况下,我希望能够创建具有此历史记录的图表。
最好的方法是什么?我想,对于group
,我会按照ISO周数和年份排序数周,作为数组键,每个键将给出该周预订的小组的小时数值。 user
也是如此。但是这会在user
和group
表中生成一个longtext列(数组被序列化),这些列将被大量获取,并且总体上使用很少。
我正在使用MySQL。
你有什么想法?
编辑:我写了一个聚合函数,我只是想确保这是我们正在讨论的事情:
function getGroupHoursPerWeek( Group $group , $sometime_during_week = null ) {
global $em;
if( !is_null( $sometime_during_week )) {
$year = date("o", $sometime_during_week );
$week_number = date("W", $sometime_during_week );
} else {
$year = date("o");
$week_number = date("W");
}
$week_start = strtotime( $year . "W" . $week_number );
$one_week_seconds = 3600 * 24 * 7;
$week_end = $week_start + $one_week_seconds;
$total_time = 0;
$query = $em->createQuery("SELECT e.start_time, e.end_time FROM SSMURBS\Entry e
JOIN e.group g
WHERE g.id = {$group->id}
AND e.start_time > $week_start
AND e.end_time < $week_end
AND e.status != " . ENTRY_STATUS_REJECTED );
$entry_times = $query->getScalarResult();
foreach( $entry_times as $entry_time ) {
$total_time += ( $entry_time["end_time"] - $entry_time["start_time"] );
}
return $total_time / 3600;
}
答案 0 :(得分:4)
为什么要处理序列化数组?
听起来你需要的不仅仅是用户和群体。
我会做类似的事情:
预订将与所有其他三个实体建立关联,以及日期时间和日期。持续时间等等。目前尚不清楚您的用户是否可以属于多个组(或更改组) - 如果可以,则每次预订都需要用户和组。如果没有,您可以只使用用户,因为这将告诉您涉及哪个组。
然后,您拥有生成所需报告所需的所有数据。