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 wieluClients.

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.

questionAnswers(6)

yourAnswerToTheQuestion