【发布时间】:2010-07-02 10:34:20
【问题描述】:
在我的数据库中,用户管理分为两个表: - 一个由 symfony sfDoctrineGuard 插件(sfGuardUser)创建,带有插件使用的用户名、密码等信息 - 我创建的另一个是用更多属性(例如名字、姓氏等)扩展此表...
我要做的是将两个表的所有属性收集在同一个对象中,以在特定页面上显示与任何成员相关的所有信息。
为此,我像这样连接了两个表:
$q = $this->createQuery()
->from('sfGuardUser u')
->leftJoin('u.Mishmember m WITH u.id = ?', $rel['member_id']);
$member = $q->fetchOne();
我的问题是生成的查询似乎是正确的,因为它选择了两个表的所有属性,但是在 $member 变量中,我只能访问 sfGuardUser 对象的属性。
我希望 $member 对象封装两个表/学说对象的所有属性。
你会怎么做?
EDIT1:如果我做一个
print_r($member->toArray())
在前面的代码之后,我得到一个二维数组,其中包含第一维中 sfGuardUser 的所有属性以及第二维中第二个表的属性。要清楚 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
)
)
所以要访问例如 table2-prop3 属性,我必须这样做: $var[Table2][table2-prop3];
这不是我想要的,因为我想将所有属性视为同一个对象或数组的一部分(好像只有一个表。)
如果你还在我身边,上面的数组应该是这样的:
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 以添加我的属性是不明智的),但我希望应用程序的代码就像我有一个表一样,因为那会很多使用起来更明智和合乎逻辑(想象一下另一个不了解模型的开发人员必须在控制器或模板上工作......)
如果添加一个继承自 sfGuardUser 和 Mishmember 的 Doctrine 类 User(PHP5 中是否有多重继承?),这样我的控制器就只有一个用户类需要处理,你会怎么想?
对我来说,询问任何用户的所有属性而不用费心找出它们存储在哪个表中会更有意义。
我不确定教义继承是如何工作的,但这对我来说似乎是最巧妙的解决方案(如果我错了,请告诉我!)
我不确定我是否已经足够清楚,所以请不要犹豫,问任何问题。
【问题讨论】: