2012-06-21 50 views
2

我正在使用cakephp框架來開發一個應用程序,我遇到了一些麻煩,充分理解了這些模型之間的關聯。您可以在下面看到這四個模型以及它們的相關數據庫字段。這個協會如何成立?

User 
id 

Profile 
id 
user_id 

Post (A blog post on the users profile) 
id 
profile_id 
topic_id 

Topic (A topic for a blog post) 
id 
name 

這裏有關聯,因爲他們目前站:

User 
hasOne: Profile 

Profile 
hasMany: Posts 

Post 
belongsTo: Topic, Profile 

現在我的問題。我不確定您是否必須定義像User hasMany Posts這樣的關聯關係,或者是否已經假設它是因爲User hasOne ProfileProfile hasMany Posts。我的另一個問題是定義一個帖子和它的主題之間的關係。

  • 配置文件可以有無限的帖子
  • 一個帖子必須與個人資料相關聯
  • 一個帖子只能有一個主題
  • 主題表中包含的所有主題的列表
  • 一個帖子不需要一個主題

鑑於這些標準我的關聯應該如何看?我所做的關於關聯的所有研究都只是簡單的例子。

我使用CakePHP版本2.1.3

感謝您的任何和所有幫助和/或建議提前

回答

2

您可以遞歸找到協會的協會,甚至更好,使用中容納。

在模型中(我建議把它在AppModel,因爲我自己使用中可容納的一切找到):

class AppModel extends Model { 
    public $actsAs = array('Containable'); 
    ... 
} 

然後當你調用讀取(或查找,或者分頁)的用戶,最有可能在您的控制器,這樣做:

$this->User->contain(array(
    'Profile' => array(
     'Post' 
    ) 
)); 
$data = $this->User->read(); 
$set('user',$data); 

如果設置數據視圖,然後你可以從$user['Profile']['Post'][0]['id']訪問職位之一的ID。

現在爲您的下一個問題,你可以有條件的關聯。

public $hasMany = array(
    'Topic' => array(
     'className' => 'Topic', 
     'conditions' => 'Post.topic_id IS NOT NULL' 
    ) 
) 
+0

非常感謝解釋和額外的信息,我已經接受了這個正確的答案。 –

2

我覺得一切都看起來不錯

你的假設是正確的,你不必須定義用戶/後關係。用戶沒有許多職位,個人資料可以。你可以在Post上存儲user_id而不是profile_id來讓事情更加直觀,但這取決於你。

主題hasMany Post,你就完成了。您所描述的主題/帖子條件可以通過表格進行控制,並保存在模型上。例如,「帖子必須與配置文件關聯」,以及根據登錄用戶的會話信息保存添加到profile_id中的帖子。

+0

我已經投了你的答案,因爲你能回答我的問題之一,但其他答案更豐富,包括例子,所以我已經給他們接受。非常感謝您的幫助。 –