ZF2将多行保存到类的属性中,该属性应为数组

时间:2016-09-04 13:30:10

标签: php zend-framework zend-framework2

在ZF2中,假设我有一个来自数据库的查询结果,如下所示:

Name | Value 
-----+-------
a    | 1
a    | 2
a    | 3
b    | 6
b    | 1
b    | 5
...

有一个课程:

class SomeClass 
{
    protected $values;
    // + getter and setter for $values
}

我想补充SomeClass,以便将values属性作为数组,如[1,2,3]。

怎么做?

PS:我知道水合作用是用HydratingResultSet()完成的,但是AFAIK,HydratingResultSet()每个表格行一个物体,而在这里我需要为一些物体保湿几行。

编辑:在@newage的评论之后,明白这个问题没有得到很好的描述。

我需要拥有从SomeClass实例化的对象,例如a = new SomeClass()b = new SomeClass()values变量填充[1, 2, 3] a 1}}和[6, 1, 5] b - 与数据库查询结果中的ab完全相符。

2 个答案:

答案 0 :(得分:1)

  

HydratingResultSet将返回ResultSetResultSet实现Iterator接口。它返回结果数组。

如果您需要其他集合类,可以编写它。 例如:

$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); // Get an adapter
$hydrator = new ClassMethods; // Create a hydrator.
$entity = Entity\User::class; // Entity class name
$prototype = new EntityCollection($hydrator, $entity);
$table = new TableGateway('table_name', $dbAdapter, null, $prototype);

如果您的实体使用方法set...get...,则需要使用ClassMethods水分器。如果实体具有属性,则需要使用ObjectProperty水分器。

用于创建实体集合。需要创建一个集合类,它需要实现IteratorResultSetInterface

class EntityCollection implements Iterator, ResultSetInterface
{
    protected $entities = [];

    protected $hydrator;

    protected $entityName;

    public function __construct($hydrator, $entityName)
    {
        $this->hydrator = $hydrator;
        $this->entityName = $entityName;
    }

    public function initialize($dataSource)
    {
        foreach ($dataSource as $dataRow) {
            $this->append($this->hydrator->hydrate((array)$dataRow, new $this->entityName()));
        }
    }

    public function append($entity)
    {
        array_push($this->entities, $entity);
        return $this;
    }

    /* Need create all methods from Iterator */
    ...
}
  

更新:来自@ dima-dz的评论之后。   您可以从数据库中读取所有数据并使用foreach

喜欢这个。实施例

$someObjectA = new SomeClass();
$someObjectB = new SomeClass();
$result = $table->select([]);
foreach ($result as $row) {
    switch ($row->Name) {
        case 'a':
            $someObjectA->add($row->Value);
            break;
        case 'b':
            $someObjectB->add($row->Value);
            break;
    }
}

答案 1 :(得分:0)

@newage,发布了一个很好的解决方案,但我发现还有另一种可能做我想做的事情,也许有点简单。有一个php函数parse_str()可以解析Mysql字段中的字符串,如果你正确格式化mysql字段的内容,则为values变量创建一个数组。使用ZF2创建所需字符串进行解析的mysql join的示例就像这样

->join(
    ['t' => 'Table', 
    't.Id = t1.Id',
    [
        'Values' =>
            new Expression("GROUP_CONCAT(
                 DISTINCT CONCAT_WS('=', t1.Id, t1.Name) SEPARATOR '&')"
            ),
    ]
)