2010-07-02 49 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