2012-08-27 6 views
1

я есть две таблицы users и userslog где я users содержит id, username, email, gender и userslog содержит id, firstname, lastname, designation и u_id, который foreign key of users table.Как вставлять значения формы zend в две таблицы в zend?

мой регистр контроллера

class RegisterController extends Zend_Controller_Action 
{ 

public function init() 
{ 
    /* Initialize action controller here */ 
} 

public function indexAction() 
{ 

    $form = new Application_Form_register(); 
    $this->view->form = $form; 

    if($this->getRequest()->isPost()) 
    { 
     $data = $this->getRequest()->getPost(); 
    } 


} 


} 

мой регистр модель

class Application_Model_DBtable_register extends Zend_Db_Table 
{ 
protected $_name = 'users'; 
// i have to define two tables here!! how? 
} 

мой регистр форма Зенд

class Application_Form_register extends Zend_Form 
{ 
public function init() 
{ 
    $this->setName('register'); 
    $this->setMethod('post'); 

    $firstname = $this->createElement('text', 'firstname'); 
    $firstname->setLabel('FirstName: ') 
       ->setRequired(true) 
       ->setFilters(array(
         'stringTrim','StringToLower')); 

    $lastname = $this->createElement('text', 'lastname'); 
    $lastname->setLabel('LastName: ') 
      ->setRequired(true) 
      ->setFilters(array(
        'stringTrim','StringToLower')); 

    $email = $this->createElement('text', 'email'); 
    $email->setLabel('Email: ') 
      ->setRequired(true); 

    $username = $this->createElement('text', 'username'); 
    $username->setLabel('UserName: ') 
      ->setRequired(true) 
      ->setFilters(array(
        'stringTrim','StringToLower')); 

    $password = $this->createElement('password', 'password'); 
    $password->setLabel('Password: ') 
      ->setRequired(true); 

    $password2 = $this->createElement('password', 'password2'); 
    $password2->setLabel('Confirm Password: ') 
      ->setRequired(true); 

    $submit = $this->createElement('submit', 'register'); 
    $submit->setLabel('Register') 
      ->setIgnore(true); 

    $this->addElements(array(
      $firstname, 
      $lastname, 
      $email, 
      $username, 
      $password, 
      $password2, 
      $submit)); 
} 

}

как я могу это сделать? мы можем использовать Zend_Auth для аутентификации? если да, то как. пожалуйста, дайте мне пример. Я видел $_dependantTable и $_referenceMaps, но я не могу его раскрыть. Я смущен, как это сделать, потому что я не могу определить имя таблицы более одного раза в классе. Я должен вставлять значения в одно и то же время в две разные таблицы.

+0

На самом деле у меня есть план, чтобы добавить '' userlog_id' в user' и когда какой-либо один может обновлять некоторые данные в 'userslog' то новая строка вставляется вместо обновления той же колонке. первичный идентификатор 'userslog' будет вставлен в' userslod_id' в таблице 'users'. –

ответ

1

нормально это неправильно :

class Application_Model_DBtable_register extends Zend_Db_Table 
{ 
protected $_name = 'users'; 
// i have to define two tables here!! how? 
} 

Цель классов, имеющих DbTable в их именах, заключается в том, что они являются адаптером/шлюзом для одной таблицы базы данных.

Так что ваш вопрос будет разбивка по крайней мере 2 классов/файлов:

class Application_Model_DBtable_Users extends Zend_Db_Table 
{ 
protected $_name = 'users'; 
} 

class Application_Model_DBtable_Userslog extends Zend_Db_Table 
{ 
protected $_name = 'userslog'; 
} 

Я бы на этом уровне положить метод в любом классе, который делает действие, необходимое для регистрации пользователя. Позже вы можете использовать карты и объекты домена.

class Application_Model_DBtable_Users extends Zend_Db_Table 
{ 
    protected $_name = 'users'; 
    /* 
    * psuedocode not meant for production 
    */ 
    public function register($array $data) { 
     //sort out the data 
     $user = array();//put the elements from the $data array that you want to go into the users table 
     $userLog = array(); //same thing for the userslog table 
     //get userslog adapter 
     $userlogTable = new Application_Model_DbTable_Userslog(); 
     //do the first insert   
     $result = $this->insert($user); 
     //insert returns the primary key of the row created, 
     $u_id = array('u_id' => $result); 
     $userLog = array_merge($u_id, $userLog); //merge u_id with existing data 
     //perform second insert 
     $result2 = $userlogTable->insert($userLog); 
     //handle any errors 
    } 
} 

Это должно служить основным примером демонстрации шагов, которые вы можете предпринять для реализации проекта. Точка, лежащая за моделями DbTable, - это абстракция соединения с данной таблицей, каждая таблица имеет собственную модель DbTable. Модель DbTable предоставляет адаптер для каждой таблицы и доступ к api, предоставляемому Zend_Db_Table_Abstract.

Этапы, показанные выше, можно так же легко сделать в третьей модели или в самом контроллере.

Примечание: Там может быть далеко, чтобы сделать это с помощью одного SQL заявление, но я не тот человек, который знает, что ответить.

+0

thnx. , но если есть другой способ не создавать разные классы для разных таблиц. Пожалуйста, помогите мне! –

+0

Существует несколько способов сделать это, не создавая класс для каждой таблицы. Но зачем беспокоиться, это простой класс, который полезен для многих вещей. Если у вас есть требование не использовать эти классы, будьте более конкретными, как то, что вам нужно выполнить. – RockyFord

2

Так, чтобы вставить значения в пользователей и userslog таблиц, вы можете попробовать:

В вашем RegisterController:

$db = new Application_Model_DBtable_register(); 

$db->instertValuesInUsers(array('column_name' => $data['value'], 'column_name' => $data['value'], ...........)); 

$db->insertValuesInUserslog(array('column_name' => $data['value'], 'column_name' => $data['value'], ...........)); 

В вас Application_Model_DBtable_register:

public function instertValuesInUsers(array $data) { 
    $this->insert($data); 
} 

public function insertValuesInUserslog(array $data) { 
    $db = new Zend_Db_Table(array('name' => 'userslog')); 

    $db->insert($data); 
} 
0

Вы можете попробовать так:

public function insertNew($tb, $data) { 
    $db = new Zend_Db_Table(array('name' => $tb)); 
    $q = $db->insert($data); 
    if($q) 
     return true; 
    else 
     return false; 
} 
+0

Некоторые объяснения были бы замечательными. – Nilambar