2015-04-06 33 views
1

只是想知道ZF2的水合结果集是否可以水合多个实体。考虑下面的代码片段:Zf2 HydratingResultSet和多个实体

$sql = new Sql($this->adapter); 
    $sqlObject = $sql->select() 
     ->from([ 
      'ART' => 'acl_roles' 
     ]) 
     ->join([ 
       'ARTT' => 'acl_role_types', 
      ], 
      'ART.type_id = ARTT.id', 
      [ 
       'ARTT.id'   => 'id', 
       'ARTT.identifier' => 'identifier', 
       'ARTT.name'  => 'name', 
       'ARTT.status'  => 'status', 
       'ARTT.dateAdded' => 'date_added', 
      ], 
      Select::JOIN_INNER 
     ) 
     ->where([ 
      'ART.identifier' => $identifier, 
     ]) 
     ->columns([ 
      'ART.id'   => 'id', 
      'ART.type_id'  => 'type_id', 
      'ART.identifier' => 'identifier', 
      'ART.name'  => 'name', 
      'ART.status'  => 'status', 
      'ART.description' => 'description', 
      'ART.dateAdded' => 'date_added', 
     ]); 

现在,如果查询是在一个单一的实体,我可以这样做:

$stmt = $sql->prepareStatementForSqlObject($sqlObject); 
$resultset = $stmt->execute(); 
if ($resultset instanceof ResultInterface && $resultset->isQueryResult()) { 
    $hydratingResultSet = new HydratingResultSet(new ArraySerializable, new EntityClass); 
    $hydratingResultSet->initialize($resultset); 
    return $hydratingResultSet->current(); 
} 

然而,在我来说,我需要的保湿结果集能够建立并返回多个实体(即AclRoleEntity和AclRoleTypeEntity)。这是可能的吗?如果是的话(考虑结果集是两个实体组合的平面阵列)。如果没有更好的替代方案来实现这一点,而不使用Doctrine/Propel?

谢谢

回答

1

这是完全可能的,你只需要一个配置(可能是定制)Hydrator。

您的水合器需要知道从平面阵列将参数注入到对象中的逻辑,以及如何在提取时将对象模型还原为平面阵列。

您可能正在考虑一些Hydrator策略或Hydrator命名策略,并可能将两者结合使用。

使用正确的水化器,您可以实现您要查找的内容。

+0

感谢您的支持。正如你所提到的,我必须用我自己的定制水合剂。 :) – 2015-04-11 10:14:46