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