name、email、company_id、personType などのフィールドを含む Person テーブルを持つデータベース構造があります。すべての Person が必ずしもシステム ユーザーのものであるとは限らないため、システム内の User である Person の userName と password を定義する別のテーブル User があります。
Person テーブルのテーブル データ ゲートウェイを定義する次のコードがあります。
class Model_Table_Person extends Zend_Db_Table_Abstract
{
protected $_name = 'person';
protected $_primary = 'person_id';
protected $_referenceMap = array(
'Company' => array(
'columns' => 'company_id',
'refTableClass' => 'Company',
'refColumns' => 'id'
),
'Store' => array(
'columns' => 'store_id',
'refTableClass' => 'Store',
'refColumns' => 'id'
)
);
public function findByPersonType(string $personType)
{
$where = $this->getAdapter()->quoteInto('personType = ?', $personType);
return $this->fetchAll($where);
}
}
そして、このコードは Person のドメイン オブジェクトを定義します。
class Model_Person
{
protected static $_gateway;
protected $_person;
public static function init()
{
if(self::$_gateway == null)
{
self::$_gateway = new Model_Table_Person();
}
}
public static function get(string $searchString, string $searchType = 'id')
{
self::init();
switch($searchString)
{
case 'id':
$row = self::$_gateway->find($id)->current();
break;
}
return self::factory($row);
}
public static function getCollection(string $searchString, string $searchType = null)
{
self::init();
switch($searchType)
{
case 'userType':
$row = self::$_gateway->findByPersonType($searchString);
break;
default:
$personRowset = self::$_gateway->fetchAll();
break;
}
$personArray = array ();
foreach ($personRowset as $person)
{
$personArray[] = self::factory($person);
}
return $personArray;
}
public function getCompany()
{
return $this->_person->findParentRow('Company');
}
public function getStore()
{
return $this->_person->findParentRow('Store');
}
protected static function factory(Zend_Db_Table_Row $row)
{
$class = 'Model_Person_' . ucfirst($row->personType);
return new $class($row);
}
// protected constructor can only be called from this class, e.g. factory()
protected function __construct(Zend_Db_Table_Row $personRow)
{
$this->_person = $personRow;
}
}
最後に、ユーザー用の別のテーブル データ ゲートウェイがあります。
class Model_Table_User extends Zend_Db_Table_Abstract
{
protected $_name = 'user';
protected $_primary = 'person_id';
public function findByUserName()
{
}
}
そして、Model_Person テーブルを次のように拡張する基本クラス:
class Model_User extends Model_Person
{
public function login()
{
}
public function setPassword()
{
}
}
「Model_User」クラス (1 つを除く他のすべてのタイプのユーザーの基本タイプを提供する) を適切に拡張して、1 つのテーブルにマップする「Model_Person」クラス関数を使用すると同時に、実際の「Model_User」関数をマップして使用するにはどうすればよいですか?セカンドテーブル?