【问题标题】:How to merge two doctrine entities in the same object如何在同一个对象中合并两个学说实体
【发布时间】: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 中是否有多重继承?),这样我的控制器就只有一个用户类需要处理,你会怎么想?

对我来说,询问任何用户的所有属性而不用费心找出它们存储在哪个表中会更有意义。

我不确定教义继承是如何工作的,但这对我来说似乎是最巧妙的解决方案(如果我错了,请告诉我!)

我不确定我是否已经足够清楚,所以请不要犹豫,问任何问题。

【问题讨论】:

    标签: php symfony1 doctrine


    【解决方案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

    【讨论】:

    • 这似乎正是我正在寻找的东西,我预计它会更复杂。非常感谢!
    【解决方案2】:

    这并不是 ORM 的真正工作方式:正如您所指出的,您会得到一个 sfGuardUser 对象/数组。现在Mishmember 对 sfGuardUser 来说只不过是一个属性(这是一个巧合,它本身就是一个对象)。因此,而不是只有一个例如字符串属性,你有一个对象/数组属性。

    编辑:如果您不喜欢多维方面,您可以合并/组合/重新创建数组/对象(如另一个答案所示)。但请记住,当您返回大量数据时,这些操作会变得相当复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2013-09-20
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多