2010-07-02 18 views
0

在我的數據庫中,用戶管理分爲兩個表: - 由symfony sfDoctrineGuard插件(sfGuardUser)創建的一個表,由用戶名,密碼和其他信息插件 - 我創建了另一個用於擴展此表的更多屬性,如名,姓等...如何在同一個對象中合併兩個主義實體

我想要做的是將兩個表的所有屬性集中到同一個對象中顯示與特定頁面上任何成員相關的所有信息。

在爲此我做了一個連接兩個表是這樣的:

$q = $this->createQuery() 
->from('sfGuardUser u') 
->leftJoin('u.Mishmember m WITH u.id = ?', $rel['member_id']); 

$member = $q->fetchOne(); 

我的問題是,生成的查詢似乎是正確的,因爲它選擇兩個表的所有屬性,但在$成員變量,我只能訪問sfGuardUser對象的屬性。

我希望$ member對象封裝兩個表/學說對象的所有屬性。

你會怎麼做?


EDIT1:如果我以前的代碼後做

print_r($member->toArray()) 

我得到包含在第一維sfGuardUser的所有屬性一個2維數組和我的第二個表的第二屬性尺寸。要清楚的print_r的結果是這樣的:

Array (
    [table1-prop1] => value 
    [table1-prop2] => value 
    [table1-prop3] => value 
    [Table2] => Array (
        [table2-prop1] => value 
        [table2-prop2] => value 
        [table2-prop3] => value 
        [table2-prop4] => value 
    ) 
) 

因此,爲了例如訪問表2,prop3財產我必須做的: 是$ var [表2] [表2-prop3]。

這不是我想要的,因爲我要考慮所有的屬性部分的sameobjet或陣列(好像有隻有一個表。)

如果你在我身邊仍然上述數組應看起來像:

Array (
    [table1-prop1] => value 
    [table1-prop2] => value 
    [table1-prop3] => value 
    [table2-prop1] => value 
    [table2-prop2] => value 
    [table2-prop3] => value 
    [table2-prop4] => value 
    ) 
) 

希望能幫助理解我的問題。


EDIT2(答案DuoSRX和DrColossos)

謝謝兩位你的有趣的答案。

那麼,我寧願不在我的sfGuardUser中擁有Mishmember屬性的原因是兩個表/類都代表同一個實體(用戶)。雖然這種碎片在我的數據庫中是不可避免的(直接編輯sfGuardPlugin來添加我的屬性並不明智),但我希望應用程序的代碼就好像我有一張表一樣,因爲那樣會很多更合理和合理的使用(想象另一個不知道模型的開發人員將不得不在控制器或模板上工作......)

您認爲如何添加一個Doctrine類?從sfGuardUser繼承的用戶和Mishmember(PHP5中是否有多重繼承?),這樣我的控制器將只有一個用戶類來處理?

它將使更多的意義,我問任何用戶的所有屬性,無需費心去找出哪些表它們存儲。

我不知道它是如何繼承主義作品,但似乎最巧妙的解決方案,我(請告訴我,如果我錯了!)

我不知道我已經夠清楚,所以請不要猶豫,問任何事情。

回答

1

如果您不需要對象,但只是數組,你可以這樣做:

$result = $query->fetchArray(); 
$mishmember = $result['Mishmember']; 
unset($result['Mishmember']); 
$user = array_merge($result, $mishmember); 

這應該做的伎倆,但我認爲這是太複雜了。擁有多維數組有什麼問題?

編輯:

那麼,你可以使用簡單或column_aggregation繼承:

Mishmember: 
    inheritance: 
    type: simple (or column_aggregation) 
    extends: sfGuardUser 
    columns: 
    myfield: 
     type:integer 

然後:

$mishmember = Doctrine::getTable('Mishmember')->find(1); 
echo $mishmember->myfield; 

更多關於繼承見doctrine documentation

+0

謝謝,我只是通過編輯我的文章回答(編輯2) – 2010-07-02 13:54:03

+0

我也編輯了我的答案:) – DuoSRX 2010-07-02 14:27:25

+0

這似乎正是我正在尋找的,我預料會更加複雜。非常感謝! – 2010-07-02 21:15:20

0

這不是真正的ORM是如何工作的:正如你提到的,你會得到一個sfGuardUser對象/數組回來。現在Mishmember不過是一個財產 sfGuardUser(這是一個巧合,這是一個對象iteself)。所以,而不是隻有一個例如字符串屬性,你有一個對象/數組屬性。

編輯:yourse你可以合併/合/重新創建陣列/物件(如對方的回答暗示),如果你不喜歡多維度方面。但請記住,當您有大量返回的數據時,這些操作可能會非常複雜。

+0

謝謝,我只是通過編輯我的帖子(EDIT2) – 2010-07-02 13:54:30