我创建了一个简单的示例项目来测试如何从CakePHP
中的一个控制器向2个表添加数据,我有一个名为Student
,Users
,{{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' => ''
)
);
}
我在这里做错了什么?请帮忙。
答案 0 :(得分:0)
IMO,学生和管理员都应该在一个名为“用户”的表格中。 你命名的桌子&#34;用户&#34;实际上是一个连接表。如果您遵循约定,那么这是一个不正确的连接表名称。
然后你会有这些模型:
如果这样链接,那么这些输入会将数据保存到所有三个表中:
$this->Form->input('User.username')
$this->Form->input('User.password')
$this->Form->input('UserGroup.id', array('value' => 15)
你应该看看CakePHP&#34;&#34;烘烤&#34;特征。如果你给它一个正确构建的数据库,它将帮助你建立正确的链接模型。
似乎您目前正在尝试做的是:
$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)
方法