【问题标题】:how to insert zend form values in two tables in zend?如何在zend的两个表中插入zend表单值?
【发布时间】:2012-08-27 11:46:28
【问题描述】:

我有两个表 usersuserslog 我有 users 包含 id, username,email,genderuserslog 包含 id,@9876543333 987654331@,designationu_idforeign key of users table

我的注册控制器

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?
}

我的注册zend表单

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,但我无法理解。我很困惑如何做到这一点,因为我不能在一个类中多次定义表名。我必须在两个不同的表中同时插入值。

【问题讨论】:

  • 实际上我计划在user 中添加userlog_id,并且当任何人都可以更新userslog 中的某些数据时,插入新行而不是更新同一列。 userslog 的主 ID 将插入到 userslod_idusers 表中。

标签: zend-framework zend-form zend-db zend-db-table zend-auth


【解决方案1】:

为了在users和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);
}

【讨论】:

    【解决方案2】:

    好的,这是不正确的:

    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 模型为每个表提供了一个适配器,并可以访问 Zend_Db_Table_Abstract 提供的 api。

    上面显示的步骤可以很容易地在第三个模型或控制器本身中执行。

    注意:可能只用一条 sql 语句就可以做到这一点,但我不是知道答案的人。

    【讨论】:

    • 谢谢。 .但是如果有另一种方法可以不为不同的表创建不同的类。那么请帮助我!
    • 有许多方法可以做到这一点,而无需为每个表创建一个类。但何必呢,这是一个对很多事情都有用的简单类。如果您有不使用这些课程的要求,请更具体地说明您需要完成的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2012-04-24
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多