1

我刚开始使用 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;
}

这很好地返回了一个地址数据数组,但我希望这些结果作为地址对象返回。我不知道该怎么做?

4

2 回答 2

2

ZF2 带有一些标准的 Hydrator,如果您愿意,可以对其进行扩展/修改。

http://framework.zend.com/manual/2.0/en/modules/zend.stdlib.hydrator.html

您可以为您的 School 对象创建一个 Hydrator,并为您的 Address 对象创建一个 Hydrator。例如,给定数据库中的数组数据,水合器将为您构建对象

例如,您要为您的 School Object 补水,然后找到所有地址(如上)并使用另一个补水器来补水。然后,您将这些添加到 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;
}

您将有一个地址结果集(集合)添加到您的学校。那是代码只是从文档中的代码中窃取的一个非常粗略的示例,以了解您的工作

于 2013-02-08T16:21:04.633 回答
0

这个怎么样?

if(!empty($resultSet)){
    foreach ($resultSet as $result) {
        $address = new Address();
        $address->exchangeArray($result);
        $addresses->append($address);
    }
}
于 2013-02-08T16:47:37.917 回答