为什么一些外键没有保存在CakePHP中

时间:2016-03-14 09:17:25

标签: mysql cakephp-2.0

我正在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保存为外键。既然他们的关系很像 - 经理已经很多客户拥有很多房子。为什么这些类似的功能在这里表现不同?任何人都可以给我任何提示,为什么没有保存外键?

1 个答案:

答案 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);

像这样你应该将数据保存在从属表中 这个完整的代码应该在你想要保存数据的控制器函数中。