在我的数据库中,用户管理分为两个表: - 由symfony sfDoctrineGuard插件(sfGuardUser)创建的插件,包含用户名,密码和插件使用的其他信息 - 我创建的另一个用于扩展此表的更多属性,例如firstname,surname等...
我想要做的是在同一个对象中收集两个表的所有属性,以显示与特定页面上任何成员相关的所有信息。
在那个目的中,我做了两个表的连接:
$q = $this->createQuery()
->from('sfGuardUser u')
->leftJoin('u.Mishmember m WITH u.id = ?', $rel['member_id']);
$member = $q->fetchOne();
我的问题是生成的查询似乎是正确的,因为它选择了两个表的所有属性,但是在$ member变量中,我只能访问sfGuardUser对象的属性。
我希望$ member对象封装两个表/ doctrine对象的所有属性。
你会怎么做?
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 [表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以添加我的属性是不明智的),我希望应用程序的代码就像我有一个表一样,因为那会很多使用起来更合情合理(想象另一个不了解模型的开发人员必须在控制器或模板上工作......)
您如何看待添加一个继承自sfGuardUser和Mishmember的Doctrine类用户(PHP5中有多个继承?)这样我的控制器只能处理一个用户类?
让我更有意义的是询问任何用户的所有属性而不必费心找出他们存储在哪个表中。
我不确定教义继承如何运作,但它似乎是我最好的解决方案(请告诉我,如果我错了!)
我不确定我是否已经足够清楚,所以请不要犹豫,不要问任何事情。
答案 0 :(得分:1)
如果你不需要对象而只需要数组,你可以这样做:
$result = $query->fetchArray();
$mishmember = $result['Mishmember'];
unset($result['Mishmember']);
$user = array_merge($result, $mishmember);
这应该可以解决问题,但我认为这太复杂了。拥有多维数组有什么问题?
编辑:
那么你可以使用simple或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。
答案 1 :(得分:0)
这并不是ORM的工作方式:正如您所说,您将获得sfGuardUser
对象/数组。现在Mishmember
只不过是sfGuardUser的属性(它是一个巧合,就是一个对象自己)。因此,而不是只有一个例如string属性,你有一个对象/数组属性。
编辑:如果您不喜欢多维方面,您可以合并/组合/重新创建数组/对象(如另一个答案所示)。但请记住,当您有大量返回数据时,这些操作会变得相当复杂。