我正在創建一個房間預訂系統。爲了這個問題,我有兩個表格:user
和group
。它們通過多對多的關係在Doctrine2中相互關聯(所以技術上我有3個表格)。保持用戶歷史的最佳方式
每週,每組允許預訂10個小時。任何成員都可以代表該組進行預訂。我希望能夠保留用戶和組的預訂歷史記錄。所以我們可以說
"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
表中生成一個長文本列(數組已被序列化),這些列將被大量獲取,並且總體上用得很少。
我正在使用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;
}
是的。我實際上有'user'' group'' entry'(預訂和請求)'room'和'floor',其中我認爲不會有幫助的('token','administrator','equipment')。你是否認爲我應該只在每次我想要數據時,從['user'和'entry']或['group'和'entry']之間的鏈接中計算小時數?這看起來像很多數學 - 有沒有一種快速的方法來做到這一點? – Daniel
我同意 - 在這裏的某個地方是房間預訂日期..然後只是運行聚合函數。 – Randy
@Daniel - 是的,您需要編寫一些例程來使用您的實體,也許還有一些自定義的DQL查詢來獲取您需要的數據。如果其中一些例程很慢,請開始考慮緩存結果的方法。你需要在某個時候進行數學運算,所以你不妨寫出可靠的代碼來爲你做。 – timdev