CakePHP zapisuje dane HABTM
Mam 2 modele,Client
iSecurity
. Są one powiązane z relacją HATBTM. Zrobiłem tabelę łączenia o nazwieclients_securities
. WięcClient
może mieć wiele papierów wartościowych iSecurity
może należeć do wieluClient
s.
Oto moje definicje relacji:
//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,
)
);
Następnie dokonałem akcji edycji na moim kontrolerze klientów i zrobiłem to:
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'));
}
}
W moim widoku edycji tworzę formularz za pomocą HtmlHelper, dodając pola tabeli klienta i generując wielokrotny wybór za pomocą:
echo $this->Form->create('Client'); //start the form for the client model
echo $this->Form->input('Security'); //generates a multi-select popuplated with securities
Ponadto mam również normalne wejścia bezpośrednie w formacieClient
w tej samej formie. na przykład
echo $this->Form->input('name'); //Input for the client name
echo $this->Form->input('currency'); //Input for the client currency
...
Wszystkie te dane wejściowe są generowane i wypełniane poprawnymi wartościami, gdy formularz jest renderowany, ale zapisywane są tylko bezpośrednie dane klienta, a nie dane HABTM z wyboru wielokrotnego.
Kiedy przesyłam formularz,clients_securities
tabela nie jest wypełniona identyfikatorami łączenia.
Co muszę zrobić, aby zapisać go poprawnie i mieć zapisane wcześniej papiery wartościowe, gdy ładuję widok „edytuj”.
Edytuj: Aby wyjaśnić, oto jestpr()
z$this->request->data
. (Wartości („ALLCMCT LX Equity”) są poprawnymi kluczami obcymi dlasecurities
stół):
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
)
)
)
Więc zasadniczo, powiedzmy, że mój identyfikator klienta to 12345, Cake powinien wstawić 2 rekordy wclients_securities
taki stół:
id | client_id | security_id
----------------------------
1 | 12345 | ALLCMCT LX Equity
2 | 12345 | APMKNTD LX Equity
Jeśli ręcznie dodam kilka dołączonych rekordów doclients_securities
, kiedy idę do edycji klienta, papiery wartościowe z wielu wyborów pojawiają się prawidłowo wstępnie zaznaczone, pokazując, że dane są odczytywane z tabeli łączenia. Kiedy zapisuję formularz, faktycznie usuwa on rekordy łączenia, ale nie zapisuje nowych.
Uwaga dodatkowa:Moje identyfikatory bezpieczeństwa są przechowywane jako CHAR (36) jeśli to ma jakiś skutek. To nie jest pole auto-inkrementacji, zawiera ono ticker zabezpieczenia i każde z nich jest unikalne.