如何查询复杂数据并在Zend Framework 2中的正确对象中返回数据?

时间:2013-02-07 12:12:09

标签: zend-framework2

我刚刚开始使用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对象返回。我不知道怎么做?

2 个答案:

答案 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);
    }
}