2011-10-18 87 views
0

我正在嘗試創建一個應用程序,該應用程序可以根據其可用性在不定期的時間表上幫助向員工或志願者分發工作。CakePHP:多個hasOne模型關係

總之,這裏是我的模型和它們之間的關係:

Users hasMany Jobs 
Jobs belongTo Users 
Users hasMany Availabilities 
Availabilities belongTo Users 
Jobs hasOne Periods 
Periods belongTo Jobs 
Availabilities hasOne Periods 
Periods belongTo Availabilities 

的問題是,「期」是兩個hasOne關係的接收方,如果我沒有錯,它的東西你不能在CakePHP中做。在這種情況下繼續進行的最佳方式是什麼?

您可能也發現了「作業」可能被分配給某人(「用戶」)的事實。我應該放棄這種關係,並在作業完成後創建它,或者我應該創建一個虛構用戶來代表未分配作業的「nobody」嗎?

我會張貼一個很好的圖像,但我沒有足夠的聲譽,對不起! 雖然這是link

回答

0

問題是,「期間」在兩個hasOne關係的接收端,如果我沒有錯,這是CakePHP無法做到的。在這種情況下繼續進行的最佳方式是什麼?

我沒有看到問題。您應該能夠將每個hasOne關係的外鍵添加到periods表(periods.job_idperiods.availability_id)。

您可能也發現了「作業」可能被分配給某人(「用戶」)的事實。我應該放棄這種關係,並在作業完成後創建它,或者我應該創建一個虛構用戶來代表未分配作業的「nobody」嗎?

這很好。只需設置jobs.user_id以允許空值並設置關係。這將允許在不分配給用戶的情況下創建作業。執行查找後,您可以檢查empty($results['User'])以確定您是否正在處理未分配的作業。

用戶的hasMany喬布斯,喬布斯通過belongsTo用戶,...

提醒您:型號名稱應爲單數(即用戶的hasMany作業,作業屬於關聯用戶等)


另外,我想要一段時間屬於一個工作或一個可用性,並永遠不會在同一時間。有沒有傳統的方法來做到這一點?

您可以在期模型寫爲驗證:

$validate = array(
    'job_id' => array(
     array(
      'rule' => 'validBelongsTo', 
      'message' => 'A period can either belong to a job or an availability' 
     ), 
    ), 
); 

public function validBelongsTo() { 
    $hasJob   = !empty($this->data['Period']['job_id']); 
    $hasAvailability = !empty($this->data['Period']['availability_id']); 
    if ($hasJob && $hasAvailability) { 
     return false; 
    } else { 
     return true; 
    } 
} 
+0

感謝您的快速回答!我忘了提到我是CakePHP的總Noob,因此我沒有意識到,例如,job.user_id可以包含一個空值...另外我想要一個週期屬於Job或一個可用性,而不是在同一時間。有沒有傳統的方法來做到這一點?無論如何,感謝您的時間,我會馬上嘗試! – Chris

0

的聲音,我喜歡Period模式應該是多態性。查看麪包店的this questionthis article的答案。

我經常使用這種技術,它對這種事情的工作很好。

+0

謝謝你的回答!這聽起來完全像我所需要的。唯一的問題是我還不熟悉行爲,更不用說安裝一個......所以我想我會堅持更容易理解的解決方案,而不是你的不是更好的解決方案。只是我現在缺乏這方面的知識......乾杯 – Chris