Modelleme Zend Framework çoklu tablo ilişkileri ile nesneleri

5 Cevap php

Ben Zend Framework ile oynuyor ve ben sadece süreci nasıl çalışacağını görmek için yapıyorum bir web sitesine karşı "hızlı başlangıç" kılavuz kullanmak çalışıyorum. Bu sorunun cevabı açıktır beni affet, umarım deneyimli birisi bu biraz ışık tutabilir.

Ben üç veritabanı tabloları var:

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

Ben bazı durumlarda her üç tablo kullanan bir kullanıcı modeli oluşturmak istiyorum. Örneğin, meta tablo meta veri gerekiyorsa / zaman erişilir. User_password tablo 'Varsayılan' auth_method ayarlandığında yalnızca erişilir. Ben büyük olasılıkla daha sonra ben kullanıcı modelinden erişebilir olmak istiyorum bir profil tablosunu ekleyerek olacak.

Neden ZF ile bunu yapmak için en iyi yolu nedir?

5 Cevap

class Users extends Zend_Db_Table_Abstract
{
    protected $_name = 'users';
    protected $_rowClass = 'User';
    protected $_dependentTables = array ('UserMetadata', 'UserPasswveyad');

...

class UserMetadata extends Zend_Db_Table_Abstract
{
    protected $_name = 'user_metadata';
    protected $_referenceMap = array (
    'Users'=> array (
    'columns'=>'user_id',
    'refTableClass'=>'Users',
    'refColumns'=>'id'
    )
    );

...

class UserPasswveyad extends Zend_Db_Table_Abstract
{
    protected $_name = 'user_passwveyad';
    protected $_referenceMap = array (
    'Users'=> array (
    'columns'=>'user_id',
    'refTableClass'=>'Users',
    'refColumns'=>'id'
    )
    );

Veri getiriliyveya:

$id = //get your user id from somewhere

$users = new Users();
$user = $users->fetchRow('id=?', $id);
if ($user->authMethod == 0)
{
    $metadata = $user->findDependentRowset('UserMetadata')->current();
}

veya

$user = $users->fetchRow($users->select()
              ->where('gender=?, 'M')
              ->veyader('email ASC');

Vb ...

Veri ekleme:

$newRow = $users->fetchNew();
$newRow->email = me@domain.com;
$newRow->save();

veya

$users = new Users();
$data = array('email'     => 'me@domain.com',
              'firstname' => 'Me');
$users->insert($data);

Güncelleniyor:

$user->email = 'me@domain.veyag';
$user->save();

Bir satır silme:

$user->delete();

Işlem kullanma:

$db->beginTransaction();
$db->commit();
$db->rollback();

etc... it's all in the ZF Manual!

Temelde kullanmak yerine Zend_Db_Table daha genel Zend_Db_Select veya Zend_Db_Statement veri almak için kullanabilirsiniz.

BTW. Siz kullanıcı modeli değil, doğrudan şifre verilere erişmek istiyor, ama yerine Zend_Auth_Adapter türetilen Kullanıcı auth sınıfında olabilir.

Özetle ben her tablo için bir model değil, tüm üç kere tek model yaratacak. I define relationships tablolar arasında o olur.

Dürüst olmak gerekirse, her tablo için bir model oluşturmak için çok "DRY" değil gibi görünüyor ama ben çevrimiçi çeşitli örneklerle defalarca yapıldığını görmek ne olduğunu ve ben ile oluşturduğunuz projelerin avuç yapmış ne Zend Framework. Herkes bu işleme daha iyi bir yol varsa ben burada yayınlarız inşallah.

Ben ZF ile bunu yapmak için en iyi yolu, Doctrine kullanarak olduğunu söyleyebilirim.

Düz yarasa kapalı sadece bir kaç not:

Ilk Kullanıcı tablo, kimlik doğrulama yöntemi dışında, daha fazla bir kişi tablo gibi görünüyor, ama muhtemelen User adlandırmak olabilir ki, user_password tablo koymak olabilir. Sadece user_password / Kullanıcı tablo ile birleştirdi olabilir gibi User_Metadata tablo görünüyor.

Farklı sınıflar olarak ayrı olanlar her modellemek, ve sonra her erişmek için bir tür cephe olarak bir UserModel sınıf olsaydı şimdi, hatta bu değişiklikler olmadan, sen, üç farklı kavramları ile, üç farklı tablo var, büyük olasılıkla daha kolay olur .