2013-07-05 49 views
1

是否可以在Propel ORM中將父級名稱字段創建爲一對多關係。Propel ORM - 與父級名稱的一對多關係

這種類型的關係用於CRM系統。

試想一下,我們有一個任務列表。所以,我們創建了一個任務#1並將其與項目相關聯。 任務#2與帳戶相關(例如創建合同)。 任務#3與Bug Tracker相關(例如修復一個bug)。 因此,我們有以下關係:

 task_name | parent_name | parent_id 
-------------------------------------------------- 
Start a project | Project  | <project_id> 
Create a contract | Account  | <account_id> 
Fix a bug   | Bug Tracker | <bug_id> 

是否有可能在波輪實現。如果不是,你能否推薦我另一個具有此功能的ORM。

主要目的是獲取包含所有關係值的記錄列表。

在我的例子,它應該看起來像(以JSON):

{ 
    "Task_0":{"Id":1,"Name":"Start a project","ParentId":1,"ParentName":"Project","Project":{"Id":1,"Name":"Project-1","Tasks":{"Task_0":"*RECURSION*"}}}, 
    "Task_1":{"Id":1,"Name":"Create a contract","ParentId":1,"ParentName":"Account","Account":{"Id":1,"Name":"Account-1","Tasks":{"Task_0":"*RECURSION*"}}}, 
    "Task_2":{"Id":1,"Name":"Fix a bug","ParentId":1,"ParentName":"Bug","Bug":{"Id":1,"Name":"Bug-1","Tasks":{"Task_0":"*RECURSION*"}}} 
} 

有誰能幫我嗎?

+0

不確定你的問題到底是什麼,'parent_name'綁定到外部的東西?爲什麼你不能創建該列? – jakerella

+0

是的,父母的名字是外在的東西。我修改了這個問題。我認爲現在應該很清楚地理解。 – user2539253

+0

我認爲你必須做一些特別的事情才能在Propel中完成這件事。外鍵關係未設置爲添加除parent_id之外的字段。我想這個問題是爲什麼這樣做,而不是簡單地在代碼中使用'$ task-> getParent() - > getName();' – jakerella

回答

1

您顯示的輸出看起來好像toArray函數已用於Propel對象,然後是json_encode函數。如果您在Propel的schema.xml中相互定義外鍵,這應該起作用。

由於項目任務,帳戶任務和錯誤跟蹤器任務都有一些共同點,它們都是任務:),我會將它們組織爲更一般任務實體的子類。

最後你會爲表這樣一個集合:

「任務」

id | name 
------------------------ 
1 | Start a project 
2 | Create a contract 
3 | Fix a bug 
4 | Start another project 
5 | Fix another bug 

--------------------------------------- 

「bugtrack_task」

id | id_task 
--------------- 
1 | 3 
2 | 5 

--------------------------------------- 

「project_task 「

id | id_task 
--------------- 
1 | 1 
2 | 4 

--------------------------------------- 

「account_task」

id | id_task 
--------------- 
1 | 2 

最後,你將定義在schema.xml視圖。這可能是這個樣子:

<table name="view_task" phpName="ViewTask" skipSql="true" readOnly="true" description="All my tasks together for display">...</table> 

注意,skipSql屬性被設置爲true。這將在生成SQL代碼時跳過此視圖表。 Propel將爲您生成類,但不會觸及您的數據庫。您現在可以手動定義視圖,無論您想要什麼,都可以將它放入其中。

當然,你不得不把一些精力來創建這個觀點,但付出總有回報,你將能夠使用的Propel類,像這樣的實例:

$tasks = ViewTask::create()->find(); 
$result = array(); 
foreach($tasks as $task) { 
    $result[] = $task->toArray(); 
} 
return json_encode($result); 

這是不是一個完整的回答,但我希望你看到這個主意!祝你好運:-)

相關問題