我刚刚开始使用ZF2而且遇到了绊脚石,我无法在互联网上找到任何有用的建议。
设置从单个表中检索数据并将其直接注入特定模型很容易,例如,从“学校”表中提取单行数据并注入“学校”模型。
但是,我有一些稍微复杂的数据,无法弄清楚如何以正确的模型形式返回数据。例如,通过学校桌子上的连接从学校地址表中提取多个地址。
我的AddressTable对象中有以下方法......
public function fetchAllSchoolAddresses($school_id)
{
$stmt = $this->adapter->createStatement();
$stmt->prepare("CALL get_school_addresses(3)");
$stmt->getResource()->bindParam(3, $school_id, \PDO::PARAM_INT, 3);
$resultSet = $stmt->execute();
$addresses = new \ArrayObject();
if(!empty($resultSet)){
foreach ($resultSet as $result) {
$addresses->append($result);
}
}
return $addresses;
}
这很好地返回了一个地址数据数组,但我希望这些结果作为Address对象返回。我不知道怎么做?
答案 0 :(得分:2)
ZF2附带一些标准的Hydrator,如果您愿意,可以扩展/修改。
http://framework.zend.com/manual/2.0/en/modules/zend.stdlib.hydrator.html
您可以为School对象创建一个Hydrator,为Address对象创建一个Hydrator。 给定数据库中的数组数据(例如
),水化器将为您构建对象例如,您可以保湿您的学校物品,然后找到所有地址(如上所述)并使用另一个保湿剂来保湿。然后,您可以将它们添加到School对象中以根据需要获取对象图
$school->addAddress($address); // etc
点击此处查看使用Hydrators和Hydrating ResultSets的示例:
http://blog.evan.pro/zf2-tablegateway-hydration http://framework.zend.com/manual/2.0/en/modules/zend.db.result-set.html
例如,你可以这样做:// How ever you want to get your database result do it here..
// this is where you get all addresses for your School
$stmt = $driver->createStatement($sql);
$stmt->prepare($parameters);
$result = $stmt->execute();
$resultSet = new HydratingResultSet(new ReflectionHydrator, new SchoolAddress);
$resultSet->initialize($result);
foreach ($resultSet as $address) {
$school->addAddress($address);
echo $address->getCity() . ' ' . $user->getPostcode() . PHP_EOL;
}
您将有一个地址的结果集(集合)添加到您的学校。 这段代码只是一个非常粗略的例子,它来自文档中的代码,可以让你知道你做了什么
答案 1 :(得分:0)
这个怎么样?
if(!empty($resultSet)){
foreach ($resultSet as $result) {
$address = new Address();
$address->exchangeArray($result);
$addresses->append($address);
}
}