zf3水合物对象有多个子对象

时间:2018-03-16 23:52:56

标签: zend-framework3

我有一个Zend Framework 3的项目,我需要一些帮助,用数据库中的数据保护对象

我有一个对象User,其中包含属性名称,phone ...以及position_id和position_name数组的位置,这些位置来自具有属性id,name,work hours ....的Position对象。

是否有可能通过一次查询使其水合。目前我正在使用Group_concat Expression和Explode策略查询,但我不确定这是最好的方法,我检查了有关Aggregate Hydrator的文档,但我不确定它是否可以使用...这是简化示例:

Users table:
id  name  phone
1   Abc   1234-1234
2   Xyz   5678-5678

Positions table
id name   workhours.... 
1  PosA   ... ....
2  PosB   ... ....
3  PosC   ... ....


Users_positins table
id   user_id   position_id
1    1         1
2    1         3
3    2         1
4    2         2
5    2         3

我的查询是这样的:

Select 'users'['id', 'name']
Join 'users_positins'
Join 'positions' ['Group_concat (concat(id,';'name SEPARATOR ","']

然后我使用ExplodeStrategy和Hydrator

 $this->hydrator->addStrategy('position_jd_revision_id', new ExplodeStrategy());
 $resultSet = new HydratingResultSet($this->hydrator, $this->userPrototype);

在我的模型中,我有setter转换字符串" id; name" to array [id] =>" name" 我成功地收到了我的对象女巫看起来像这样:

user
  name->Abc
  phone->1234-1234
  positions->[1=>PosA, 3=>PosC]
user
  name->Xyz
  phone->5678-5678
   positions->[1=>PosA, 2=>PosB, 3PosC]

再次澄清我的问题 - 是否可以通过一个查询获得结果并且位置可以自动水合位置对象数组如下:

name->Abc
phone->1234-1234
positions->[Position{id->1, name->PosA}, Position{id->3, name->PosC}]

我检查了Aggregate Hydrators但是当你有没有重复子对象的对象时它们看起来更有用。 我想象的是一个很好的解决方案是,如果我不连接位置属性,那么我将有多个行,这些行具有相同的用户属性但不同的位置属性,然后以某种方式自动检测应插入哪个水合位置对象用户对象......

0 个答案:

没有答案