Zend多対多の関係
-
10-07-2019 - |
質問
3つのテーブルからすべてのデータを取得したい
users、properties、users_properties。
それで、manytomanyRowsetを使用することにしました。しかし、驚いたことに、私はプロパティおよびusers_propertiesテーブルからデータを取得しますが、usersテーブルからはデータを取得しません。何故ですか? usersテーブルのいくつかの列が必要です。manytomanyrowset関数に、現在のテーブルのデータも必要であることを伝える方法はありますか?
これは私の機能です
public function fetchRegisteredProperties()
{
$userTable = $this->getTable();
require_once APPLICATION_PATH . '/models/DbTable/UsersPropertiesDB.php';
require_once APPLICATION_PATH . '/models/DbTable/PropertiesDB.php';
$propertiesRowset = $table->fetchAll();
$allProperties = array();
foreach ($propertiesRowset as $row) {
$propertiesRowset = $row->findManyToManyRowset(
'Model_DbTable_Properties','Model_DbTable_UsersProperties');
$allProperties = array_merge($tempArray,$propertiesRowset->toArray());
}
return $allProperties;
}
事前に感謝します
解決
Zend Frameworkのテーブル関係機能を設計およびコーディングしました。
質問に対する答えは「いいえ」です。 findManyToManyRowset()
メソッドは関連テーブルから行をフェッチするだけで、対応するRowオブジェクトにマージしません。その理由は、ZFのRowオブジェクトはそれ自体を save()
してデータベースに戻すことができ、フィールドを追加した場合、それらの処理方法がわからないからです。
したがって、ユーザーフィールドとユーザープロパティのコレクションの両方を保持するカスタムRowオブジェクトを実装する必要があります。ユーザープロパティをRowsetオブジェクトとして保存します。
次に __ get()
および __ set()
を拡張して、オブジェクトプロパティの読み取りまたは書き込み時にフィールドを正しい配列にマップする方法を認識できるようにします。つまり、ユーザー行の一部ではないフィールドを読み書きしようとすると、ユーザープロパティRowsetにフォールバックします。
save()
も拡張して、現在の行を保存するだけでなく、ユーザープロパティの行セットで save()
を呼び出します。