将数据保存到CakePHP中的数据库中的2个表

时间:2014-08-05 18:31:31

标签: php mysql database cakephp cakephp-2.3

我创建了一个简单的示例项目来测试如何从CakePHP中的一个控制器向2个表添加数据,我有一个名为StudentUsers,{{1}的表}和Admin。我需要将一个Student添加到数据库表中,并将学生用户名和密码添加到users表中。以下是表格的SQL。

UserGroups

我创建了以下函数来将数据添加到CREATE TABLE `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_group_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, `username` varchar(40) DEFAULT NULL, `password` varchar(40) DEFAULT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_group_id` int(11) DEFAULT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `user_groups` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role` varchar(255) DEFAULT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; CREATE TABLE `admins` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_group_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `post` varchar(255) DEFAULT NULL, `username` varchar(40) DEFAULT NULL, `password` varchar(40) DEFAULT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; 表和Students表中。

Users

学生的模型如下。

public function add() {
        if ($this->request->is('post')) {

                    $userGrp = $this->request->data['Student']['user_group_id'];
                    $username = $this->request->data['Student']['username'];
                    $pass = $this->request->data['Student']['password'];

            $this->Student->create();
            if ($this->Student->save($this->request->data)) {
                                $this->request->data['User']['user_group_id'] = $userGrp;
                                $this->request->data['User']['username'] = $username;
                                $this->request->data['User']['password'] = $pass;
                                if ($this->Student->User->save($this->request->data)) {
                                    $this->Session->setFlash(__('The student has been saved. Both in to Student and User'));
                                    return $this->redirect(array('action' => 'index'));
                                }

            } else {
                $this->Session->setFlash(__('The student could not be saved. Please, try again.'));
            }
        }
        $userGroups = $this->Student->UserGroup->find('list');
        $this->set(compact('userGroups'));
    }

当我在显示错误后将学生详细信息添加到数据库中。数据将发送到Student表,但不会发送到Users表

<?php
App::uses('AppModel', 'Model');

class Student extends AppModel {

    public $displayField = 'name';

    public $belongsTo = array(
            'UserGroup' => array(
                    'className' => 'UserGroup',
                    'foreignKey' => 'user_group_id',
                    'conditions' => '',
                    'fields' => '',
                    'order' => ''
            )
    );

}

我在这里做错了什么?请帮忙。

2 个答案:

答案 0 :(得分:0)

IMO,学生和管理员都应该在一个名为“用户”的表格中。 你命名的桌子&#34;用户&#34;实际上是一个连接表。如果您遵循约定,那么这是一个不正确的连接表名称。

然后你会有这些模型:

  • 用户(belongsTo UserGroups)
  • UserGroups(habtm用户通过UserGroupUsers)
  • UserGroupUsers(belongsTo Users&amp; belongsTo UserGroups)

如果这样链接,那么这些输入会将数据保存到所有三个表中:

$this->Form->input('User.username')

$this->Form->input('User.password')

$this->Form->input('UserGroup.id', array('value' => 15)

你应该看看CakePHP&#34;&#34;烘烤&#34;特征。如果你给它一个正确构建的数据库,它将帮助你建立正确的链接模型。

似乎您目前正在尝试做的是:

  • 学生(所属用户)
  • UserGroups(habtm学生通过用户和habtm管理员通过用户)
  • 用户(属于学生和所属者以及属于管理员)

$this->Form->input('Student.username')

$this->Form->input('User.password')

$this->Form->input('UserGroup.id', array('value' => 15)

答案 1 :(得分:0)

模型学生与模型用户无关。 因此,如果您在学生模型中未定义任何关联的情况下执行$this->Student->User->save(),那么您之后会收到您显示的错误,因为Student不了解User

尝试在学生和用户模型之间定义模型关联,如下所示:学生属于用户,用户属于用户组

class Student extends AppModel {

public $displayField = 'name';

public $belongsTo = array(
        'User' => array(
                'className' => 'User',
                'foreignKey' => 'user_id',
                'conditions' => '',
                'fields' => '',
                'order' => ''
        )
);

}

class User extends AppModel {



public $belongsTo = array(
        'UserGroup' => array(
                'className' => 'UserGroup',
                'foreignKey' => 'user_group_id',
                'conditions' => '',
                'fields' => '',
                'order' => ''
        )
);

}

这假定您将Student.user_group_id重命名为数据库中的Student.user_id。现在,如果要从Student控制器保存用户,可以使用:

  • $this->Student->User->save($this->request->data)
  • 如果您正确命名了表单字段,请使用此saveAssociated()之类的$this->Student->saveAssociated($this->request->data)方法