Я разрабатываю веб-приложение в 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 дом. почему тезисы аналогичных функций ведут себя по-другому здесь? Может ли кто-нибудь дать мне какие-то намеки, почему внешние ключи не сохранены?
Вам необходимо вручную сохранить внешний ключ, потому что внешний ключ генерируется при сохранении данных родительской таблицы. Вы должны вручную сохранять данные в каждой таблице. –
@ Тони, как это сделать? потому что, когда пользователи будут использовать приложение, они не смогут вставлять данные в таблицы вручную. – Tom
Есть ли у вас здравый смысл. вручную означает ручное сохранение данных в таблице. загружать каждую модель и передавать массив данных для сохранения. Нравится: $ 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); –