20

私はZend Frameworkをいじっていて、プロセスがどのように機能するかを確認するためだけに、作成中のWebサイトに対して「クイックスタート」ガイドを使用しようとしています. この答えが明らかな場合はご容赦ください。うまくいけば、経験豊富な誰かがこれに光を当てることができます。

3 つのデータベース テーブルがあります。

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

特定の状況で 3 つのテーブルすべてを使用する User モデルを作成したいと考えています。たとえば、メタデータが必要な場合は、メタデータ テーブルにアクセスします。user_password テーブルは、「デフォルト」の auth_method が設定されている場合にのみアクセスされます。ユーザーモデルからアクセスできるようにしたいプロファイルテーブルを後で追加する可能性があります。

ZF でこれを行う最善の方法とその理由は何ですか?

4

5 に答える 5

23
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 マニュアルに記載されています。

于 2009-03-12T21:53:45.570 に答える
2

簡単に言えば、3 つすべてにアクセスする 1 つのモデルではなく、テーブルごとにモデルを作成します。次に、テーブル間の関係を定義します。

正直なところ、テーブルごとにモデルを作成する必要があるのはあまり「DRY」ではないように思えますが、それはオンラインのさまざまな例で繰り返し行われていることであり、私が作成した少数のプロジェクトで行ったことです。 Zend フレームワーク。誰かがこれを処理するより良い方法を持っている場合は、ここに投稿してください。

于 2009-03-12T21:36:10.853 に答える
2

Zend_Db_Table基本的に、より一般的な使用Zend_Db_SelectZend_Db_Statementデータの取得に使用する代わりに。

ところで。User モデルではなく、 から派生した User auth クラスでパスワード データにアクセスしたい場合がありますZend_Auth_Adapter

于 2009-03-12T13:37:09.987 に答える
0

ZF でこれを行う最善の方法は、Doctrineを使用することです。

于 2009-03-12T16:01:03.000 に答える
0

すぐに使えるいくつかのメモ:

最初の User テーブルは、auth メソッドを除いて Person テーブルのように見えますが、それを User_Password テーブルに入れることができ、おそらく User の名前を変更できます。User_Metadata テーブルは、User_Password/User テーブルと合併するだけのようです。

これらの変更がなくても、3 つの異なる概念を持つ 3 つの異なるテーブルがあります。これらのそれぞれを異なるクラスとして別々にモデル化し、それぞれにアクセスするための一種のファサードとして UserModel クラスを使用すると、おそらく簡単になります。 .

于 2009-03-12T17:03:31.510 に答える