J'ai une structure de base de données qui a une table Person qui contient des champs tels que le nom, email, company_id, personType et autres. Parce que toutes les personnes ne sont pas nécessairement des utilisateurs du système, j'ai une table distincte Utilisateur qui définit userName et mot de passe pour ces personnes qui sont des utilisateurs dans le système.Comment établir plusieurs héritages de tables dans le domaine à l'aide de Zend Framework?
Je le code suivant pour définir le tableau de données Passerelle pour la personne Tableau:
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);
}
}
Ce code définit l'objet de domaine pour personne:
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;
}
}
Enfin, j'ai une autre table Passerelle de données pour l'utilisateur:
class Model_Table_User extends Zend_Db_Table_Abstract
{
protected $_name = 'user';
protected $_primary = 'person_id';
public function findByUserName()
{
}
}
Et une classe de base qui étend la table Model_Person e comme ceci:
class Model_User extends Model_Person
{
public function login()
{
}
public function setPassword()
{
}
}
Comment prolonger correctement la classe « Model_User » (qui sert un type de base pour tous les autres types d'utilisateurs mais) d'utiliser les fonctions de classe « Model_Person » qui carte à un tout de table également mappant les fonctions "Model_User" réelles pour utiliser une deuxième table?
Voulez-vous concevoir différemment les relations entre les classes User et Person? J'ai pensé essayer cette méthode d'extension de la classe Model_Person, puis implémenter un second objet $ _gateway pour l'objet User, mais il ne semble pas que ça se passe bien. –
Je pense avoir décidé d'utiliser les tables $ _referenceMap de User et Person pour définir l'utilisation des données dans la table User plutôt que d'essayer de créer une sorte d'héritage de passerelle multiple? Est-ce que cela semble plus ou moins correct? –
Ouais, j'ai l'impression que le langage PHP ne supporte pas ce que vous essayez de faire. Vous pourriez avoir besoin d'une classe d'usine après tout. –