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;
}

これは非常にうまくアドレス データの配列を返しますが、これらの結果を Address オブジェクトとして返す必要があります。これを行う方法がわかりませんか?

4

2 に答える 2

2

ZF2にはいくつかの標準的なハイドレーターが付属しており、必要に応じて拡張/変更できます。

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

Schoolオブジェクト用のHydratorと、Addressオブジェクト用のHydratorを作成できます。ハイドレーターは、たとえばデータベースからの配列データを指定して、オブジェクトを構築します

たとえば、学校のオブジェクトをハイドレイトしてから、すべてのアドレス(上記のように)を見つけ、別のハイドレーターを使用してそれらをハイドレイトします。次に、それらをSchoolオブジェクトに追加して、必要に応じてオブジェクトグラフを取得します。

$school->addAddress($address); // etc

ハイドレーターとハイドレイティング結果セットの使用例については、こちらをご覧ください。

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 に答える