CakePHP guardando datos HABTM

Tengo 2 modelos,Client ySecurity. Están asociados con una relación HATBTM. He hecho una tabla de unión llamadaclients_securities. Entonces unClient puede tener muchos valores y unaSecurity puede pertenecer a muchosClients.

Aquí están mis definiciones de relaciones:

 //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,
        )
);

Luego realicé una acción de edición en el controlador de mis clientes e hice esto:

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'));
        }
    }

En mi vista de edición, compilo el formulario con HtmlHelper, agregando los campos de la tabla del cliente y generando la selección múltiple con:

echo $this->Form->create('Client'); //start the form for the client model
echo $this->Form->input('Security'); //generates a multi-select popuplated with securities

Además también tengo entradas de forma directa normales para elClient en la misma forma p.ej.

echo $this->Form->input('name'); //Input for the client name
echo $this->Form->input('currency'); //Input for the client currency
...

Todas estas entradas se generan y completan con los valores correctos cuando se representa el formulario, pero solo se guardan los datos directos del Cliente, no los datos HABTM de la selección múltiple.

Cuando presento el formularioclients_securities tabla no se rellena con los ID de unión.

¿Qué debo hacer para guardarlo correctamente y luego preseleccionar los valores guardados cuando vuelva a cargar la vista "editar"?

Edit: Para aclarar las cosas, aquí hay unpr() de$this->request->data. (Los valores ("ALLCMCT LX Equity") son las claves foráneas correctas para elsecurities mesa):

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
                )

        )

)

Básicamente, digamos que mi ID de cliente era 12345, Cake debería insertar 2 registros en elclients_securities mesa así

id | client_id | security_id
----------------------------
1  | 12345     | ALLCMCT LX Equity
2  | 12345     | APMKNTD LX Equity

Si agrego manualmente algunos registros de unión enclients_securities, cuando voy a editar un cliente, los valores en la selección múltiple aparecen correctamente preseleccionados, lo que muestra que los datos se están leyendo de la tabla de unión. Cuando guardo el formulario, en realidad elimina los registros de unión pero no guarda los nuevos.

Nota adicional:Mis ID de seguridad se almacenan como CHAR (36) Si eso tiene algún efecto. Este no es un campo de incremento automático, contiene el ticker de la seguridad y cada uno es único.

Respuestas a la pregunta(6)

Su respuesta a la pregunta