我正在CakePHP 2.5.1中开发一个Web应用程序。我在将数据库中的外键保存并在网页中显示相关数据时遇到问题。我有用户,经理,客户,房屋,地址和电子邮件表。
他们的关系是,
我的要求是,
现在,我可以保存所有数据。但是在数据库中,不保存外键,因此在显示关联数据时会产生问题。例如,当经理的注册完成后,它将manager_id保存在地址表中;但是customer_id和house_id保持为NULL。当为经理添加客户时,它会将customer_id保存在地址表中;但是manager_id和house_id保持为NULL。但是,它应该保存manager_id,因为客户属于经理。同样,当为客户添加房屋时,它会将house_id保存在地址表中;但是manager_id和customer_id仍为NULL。但是,它应该保存manager_id和customer_id,因为房子属于客户,而该客户属于经理。
在AppController中,我定义了如下关系:
'Auth' => array(
'loginRedirect' => array('controller' => 'users', 'action' => 'index'),
'logoutRedirect' => array('controller' => 'users', 'action' => 'login'),
'authenticate' => array('Form' => array(
'contain' => array(
'Manager' => array(
'Address' , 'Email' , 'Customer' => array('House')))
在userscontrollers中,我使用了以下方法:
public function add() {
if ($this->request->is('post')) {
$this->User->create();
if ($this->User->saveAll($this->request->data, array('deep' => true))) {
$components = array('Session');
$this->Session->setFlash('Welcome!');
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(
__(' Please, try again.')
);
}
}
在CustomersControllers中,我使用了以下方法:
public function AddCustomer() {
if ($this->request->is('post')) {
$this->Customer->create();
if ($this->Customer->saveAll($this->request->data, array('deep' => true))) {
$primaryKey = $this->Customer->id;
$components = array('Session');
$this->Session->setFlash('Customer DATA have been saved!');
return $this->redirect(array('action' => ‘index'));
}
$this->Session->setFlash(
__('The Customer Data could not be saved. Please, try again.')
);
}
}
在HousesControllers中,我使用了以下方法:
public function AddHouse() {
if ($this->request->is('post')) {
$this->House->create();
$this->loadModel('House');
$houseData = $this->data['House'];
$houseData[‘house_id'] = $primaryKey;
if ($this->House->saveAll($houseData)) {
$components = array('Session');
$this->Session->setFlash(‘House DATA have been saved!');
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(
__('The House Data could not be saved. Please, try again.')
);
}
}
当在userscontroller中使用add()时,它会使用外键保存用户和管理器数据。即,manager_id作为外键保存在users表中。但类似的函数addCustomer()和addHouse()不保存外键。 customers表应将manager_id保存为外键,而house表应将customer_id保存为外键。既然他们的关系很像 - 经理已经很多客户拥有很多房子。为什么这些类似的功能在这里表现不同?任何人都可以给我任何提示,为什么没有保存外键?
答案 0 :(得分:1)
您应首先将数据保存在父表中,如users表 喜欢这个
$saveData = $this->data['User'];
$this->loadModel('User');
$this->User->save($saveData);
现在得到这样的主键:
$userId = $this->User->id;
现在将数据保存在其他表格中,这些数据依赖于' $ userId'意味着$ userId现在是这些表的外键,如地址,用户详细信息,经理等; 现在将数据保存在地址表中
$addressData = $this->data['Address'];
$addressData['user_id'] = $userId; // This be foreign Key for address table
$this->loadModel('Address');
$this->Address->save($addressData);
像这样你应该将数据保存在从属表中 这个完整的代码应该在你想要保存数据的控制器函数中。