У меня есть структура базы данных, в которой есть таблица Person, которая содержит поля, такие как имя, адрес электронной почты, company_id, personType и тому подобное. Поскольку не все лица обязательно являются системными пользователями, у меня есть отдельная таблица 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» (который служит базовым типом для всех других типов пользователей, кроме одного), чтобы использовать функции класса «Model_Person», которые отображаются в одну таблицу, а также отображают фактические функции «Model_User» использовать вторую таблицу?