在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
- 与数据库查询结果中的a
和b
完全相符。
答案 0 :(得分:1)
HydratingResultSet
将返回ResultSet
。ResultSet
实现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
水分器。
用于创建实体集合。需要创建一个集合类,它需要实现Iterator
和ResultSetInterface
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 '&')"
),
]
)