Я играю с Zend Framework и пытаюсь использовать руководство «QuickStart» против веб-сайта, которое я делаю, чтобы посмотреть, как этот процесс будет работать. Простите меня, если этот ответ очевиден, мы надеемся, что кто-то испытает, может пролить свет на это.
У меня три таблицы базы данных:
CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `email` varchar(255) NOT NULL, `username` varchar(255) NOT NULL default '', `first` varchar(128) NOT NULL default '', `last` varchar(128) NOT NULL default '', `gender` enum('M','F') default NULL, `birthyear` year(4) default NULL, `postal` varchar(16) default NULL, `auth_method` enum('Default','OpenID','Facebook','Disabled') NOT NULL default 'Default', PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 CREATE TABLE `user_password` ( `user_id` int(11) NOT NULL, `password` varchar(16) NOT NULL default '', PRIMARY KEY (`user_id`), UNIQUE KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 CREATE TABLE `user_metadata` ( `user_id` int(11) NOT NULL default '0', `signup_date` datetime default NULL, `signup_ip` varchar(15) default NULL, `last_login_date` datetime default NULL, `last_login_ip` varchar(15) default NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
Я хочу создать модель User, которая использует все три таблицы в определенных ситуациях. Например, метаданные получают доступ, если / когда метаданные необходимы. Доступ к таблице user_password осуществляется только в том случае, если установлен параметр auth_method по умолчанию. Скорее всего, я добавлю таблицу профилей позже, чтобы получить доступ к пользовательской модели.
Каков наилучший способ сделать это с ZF и почему?
class Users extends Zend_Db_Table_Abstract { protected $_name = 'users'; protected $_rowClass = 'User'; protected $_dependentTables = array ('UserMetadata', 'UserPassword'); ... class UserMetadata extends Zend_Db_Table_Abstract { protected $_name = 'user_metadata'; protected $_referenceMap = array ( 'Users'=> array ( 'columns'=>'user_id', 'refTableClass'=>'Users', 'refColumns'=>'id' ) ); ... class UserPassword extends Zend_Db_Table_Abstract { protected $_name = 'user_password'; protected $_referenceMap = array ( 'Users'=> array ( 'columns'=>'user_id', 'refTableClass'=>'Users', 'refColumns'=>'id' ) );
Получение данных:
$id = //get your user id from somewhere $users = new Users(); $user = $users->fetchRow('id=?', $id); if ($user->authMethod == 0) { $metadata = $user->findDependentRowset('UserMetadata')->current(); }
или
$user = $users->fetchRow($users->select() ->where('gender=?, 'M') ->order('email ASC');
… и т.д.
Вставка данных:
$newRow = $users->fetchNew(); $newRow->email = me@domain.com; $newRow->save();
или
$users = new Users(); $data = array('email' => 'me@domain.com', 'firstname' => 'Me'); $users->insert($data);
Обновление:
$user->email = 'me@domain.org'; $user->save();
Удаление строки:
$user->delete();
Использование транзакции:
$db->beginTransaction(); $db->commit(); $db->rollback();
и т. д. это все в руководстве ZF !
В основном вместо использования Zend_Db_Statement
для получения данных используйте более общие Zend_Db_Select
или Zend_Db_Statement
.
КСТАТИ. Возможно, вам захочется получить доступ к данным пароля не непосредственно в модели пользователя, а скорее в вашем пользовательском классе auth, полученном из Zend_Auth_Adapter
.
В двух словах я бы создал модель для каждой таблицы, а не одну модель, которая обращается ко всем трем. Затем я определял бы отношения между таблицами.
Честно говоря, кажется, что не очень «СУХОЙ» нужно создать модель для каждой таблицы, но это то, что я вижу неоднократно в различных примерах онлайн, и это то, что я сделал в нескольких проектах, которые я создал с помощью Zend Framework. Если у кого-то есть лучший способ справиться с этим, я надеюсь, что он разместит его здесь.
Я бы сказал, что лучший способ сделать это с ZF – это использовать Doctrine .
Всего несколько заметок прямо с места в карьер:
Первая таблица пользователей выглядит скорее как таблица Person, за исключением метода auth, но вы можете поместить ее в таблицу User_Password, которую вы, вероятно, можете переименовать User. Похоже, что таблица User_Metadata просто объединяется с таблицей User_Password / User.
Теперь, даже без этих изменений, у вас есть три разные таблицы с тремя различными понятиями, если вы моделируете каждый из этих разделов как разные классы, а затем у вас есть класс UserModel как вид фасада для доступа к ним, это, скорее всего, упростит ,