У меня есть 2 модели, Client
и Security
. Они связаны с отношением HATBTM. Я сделал таблицу соединений под названием clients_securities
. Таким образом, Client
может иметь много ценных бумаг, а Security
может принадлежать многим Client
.CakePHP сохранение данных HABTM
Вот мои определения отношения:
//Client Model:
public $hasAndBelongsToMany = array(
'Security' =>
array(
'className' => 'Security',
'joinTable' => 'clients_securities',
'foreignKey' => 'client_id',
'associationForeignKey' => 'security_id',
'unique' => true,
)
);
//Security Model:
public $hasAndBelongsToMany = array(
'Client' =>
array(
'className' => 'Client',
'joinTable' => 'clients_securities',
'foreignKey' => 'security_id',
'associationForeignKey' => 'client_id',
'unique' => true,
)
);
Я тогда сделал действие редактирования в мой контроллер клиентов и сделал это:
public function edit($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid client'));
}
$client = $this->Client->findById($id);
if (!$client) {
throw new NotFoundException(__('Invalid client'));
}
if ($this->request->is('post') || $this->request->is('put')) {
$this->Client->id = $id;
if ($this->Client->saveAll($this->request->data)) {
$this->Session->setFlash(__('Client has been updated.'));
return $this->redirect(array('action' => 'edit', $id));
}
$this->Session->setFlash(__('Unable to update client.'));
}
if (!$this->request->data) {
$this->request->data = $client;
$this->set('securities', $this->Client->Security->find('list'));
}
}
На мой взгляд редактирования я строю формы с помощью HtmlHelper, добавляя поля таблицы клиента и генерируя множественный выбор с помощью:
echo $this->Form->create('Client'); //start the form for the client model
echo $this->Form->input('Security'); //generates a multi-select popuplated with securities
Кроме того, у меня также есть обычные входы прямой формы для Client
в том же виде. например
echo $this->Form->input('name'); //Input for the client name
echo $this->Form->input('currency'); //Input for the client currency
...
Все эти входы получить сгенерированные и заселена с правильными значениями, когда форма оказывается, но только данные прямого клиента сохраняется, а не HABTM данные из множественного выбора.
Когда я отправляю форму, таблица clients_securities
не заполняется идентификаторами объединения.
Что нужно сделать, чтобы сохранить его правильно и затем сохранить сохраненные ценные бумаги, когда я перезагружу «редактирование».
Edit: Для того, чтобы прояснить вещи, вот pr()
из $this->request->data
. (значение («ALLCMCT LX Equity») являются правильными внешними ключами для securities
таблицы):
Array
(
[Client] => Array
(
[id] => 1212
[name] => Example Client
[currency] => GBP
[partner] =>
[risk_category_id] => 4
[client_code_id] => 1
[min_cash_balance] => 0
[active] => 1
[model] => 0
[institutional] => 0
[non_uk_situs] => 0
[reporting_status] => 0
)
[Security] => Array
(
[Security] => Array
(
[0] => .1muslib3 index
[1] => .eurib3 index
[2] => .ukcpi2 index
)
)
)
Так по существу, сказать, что мой идентификатор клиента был +12345, торт должен вставить 2 записей в clients_securities
таблице как так :
id | client_id | security_id
----------------------------
1 | 12345 | ALLCMCT LX Equity
2 | 12345 | APMKNTD LX Equity
Если я вручную добавить некоторые присоединиться к записи в clients_securities
, когда я иду редактировать клиенту ценные бумаги в мульти-выбора придумать правильно предварительно выбран, показывая, что данные считываются из соединительной таблице. Когда я сохраняю форму, она фактически удаляет записи соединения, но не сохраняет новые.
Дополнительное примечание: Мои идентификаторы безопасности хранятся в виде CHAR (36), если это имеет какой-либо эффект. Это не поле auto-increment, оно содержит тикер безопасности, и каждый из них уникален.
Смотрите эту Http: // StackOverflow .com/a/18891807/1239506 –
Я прочитал все связанные вопросы, которые я могу найти без успеха. – harryg
Он должен работать так, как вы. Во всяком случае, вы попробовали «уникальный» => «keepExisting»? Кроме того, я не думаю, что формат ID является проблемой, но просто для того, чтобы убедиться, что вы пытались использовать фальшивый идентификатор INT? И наконец: не могли бы вы разместить полную информацию о параметрах 'pr ($ this-> request->)' (без конфиденциальных данных, конечно) – arilia