2016-03-14 3 views
0

Я разрабатываю веб-приложение в CakePHP 2.5.1. Я сталкиваюсь с проблемами при сохранении внешних ключей в базе данных и отображении связанных данных на веб-страницах. У меня есть пользователи, менеджеры, клиенты, дома, адреса и электронные письма.Почему некоторые внешние ключи не сохраняются в CakePHP

их отношения,

  • менеджер может иметь много клиентов,
  • клиент может иметь множество домов,
  • менеджер может иметь много адресов, много писем,
  • клиента могут имеют много адресов, много писем,
  • дом может иметь много адресов

мои требования,

  • менеджер пользователи
  • после регистрации, менеджер добавит несколько клиентов. против каждого клиента менеджер добавит несколько домов.
  • каждый пользователь/менеджер имеет страницу профиля/индекса, где будут перечислены все ее клиенты.
  • каждый клиент имеет страницу профиля/индекса, где будут указаны все его дома.

Теперь я могу сохранить все данные. но в базе данных внешние ключи не сохраняются, что создает проблему при отображении связанных данных. например, когда регистрация менеджера завершена, он сохраняет 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.') 
      ); 
     } 
    } 

в ДомаКонтроллеры, я использовал следующий метод:

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, он сохраняет пользователей и менеджеров данных с иностранными keys.i.e manager_id сохраняется в таблице пользователей в качестве внешнего ключа. но аналогичные функции addCustomer() и addHouse() не сохраняют внешние ключи. таблица клиентов должна сохранять manager_id как внешний ключ, а таблица домов должна сохранять client_id как внешний ключ. так как их отношения похожи - менеджер hasMany клиент hasMany дом. почему тезисы аналогичных функций ведут себя по-другому здесь? Может ли кто-нибудь дать мне какие-то намеки, почему внешние ключи не сохранены?

+0

Вам необходимо вручную сохранить внешний ключ, потому что внешний ключ генерируется при сохранении данных родительской таблицы. Вы должны вручную сохранять данные в каждой таблице. –

+0

@ Тони, как это сделать? потому что, когда пользователи будут использовать приложение, они не смогут вставлять данные в таблицы вручную. – Tom

+0

Есть ли у вас здравый смысл. вручную означает ручное сохранение данных в таблице. загружать каждую модель и передавать массив данных для сохранения. Нравится: $ saveData = $ this-> data; $ this-> loadModel ('Пользователь'); $ this-> Пользователь ($ saveData); $ userId = $ this-> User-> id; $ managerData = любые данные; $ manager ['user_id'] = $ userId; // Foreign Key $ this-> loadModel ('Manager'); $ this-> Manager-> save ($ manager); –

ответ

1

Вы должны сначала сохранить данные в вашей родительской таблицы как таблицы пользователей Как это

$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); 

Как это вы должны сохранить данные в зависимых таблицах
Этого полный код должен быть в функции контроллера, где вы хотите сохранить данные.

+0

где я должен писать эти коды? это должно быть написано в той же функции в контроллере? – Tom

+0

Да, этот полный код должен быть в вашей функции контроллера, где вы хотите сохранить данные. –

+0

Что это за строка $ saveData = 'Данные пользователя'; имею в виду ? я должен вводить данные из формы ввода, где пользователи заполнят форму своими данными, такими как адрес, телефон и т. д., например. Я использую следующую функцию в моей службе CustomerController: public function AddCustomer() { if ($ this-> request-> is ('post')) { $ this-> Customer-> create(); if ($ this-> Customer-> saveAll ($ this-> request-> data, array ('deep' => true))) { $ components = array ('Session'); $ this-> Session-> setFlash ('Клиентские данные были сохранены!'); Return $ this-> redirect (array ('action' => 'index')); }}} – Tom

Смежные вопросы