CakePHP 2.1 guardando campos HABTM

Tengo dos modelos User y Movie... Donde están asociados con UsersWatchlist...

public $hasAndBelongsToMany = array('User' => array(
        'className' => 'User',
        'joinTable' => 'users_watchlists',
        'foreignKey' => 'movie_id',
        'associationForeignKey' => 'user_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
))

public $hasAndBelongsToMany = array(
   'Movie' => array(
        'className' => 'Movie',
        'joinTable' => 'users_watchlists',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'movie_id',
        'unique' => 'keepExisting',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
))
public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Movie' => array(
        'className' => 'Movie',
        'foreignKey' => 'movie_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ))

Creé la acción 'lista de observación' en UsersController. El código está debajo

public function watchlist($id = null) {
    $userid = 3;
    if (!$id && $userid != 3) {
        $this->Session->setFlash('Invalid Movie');
        $this->redirect($this->referer(array('action' => 'listing')));
    }
    $this->request->data['User']['id'] = $userid;
    $this->User->UsersWatchlist->create();
    debug($this->User->UsersWatchlist->saveAll(array('user_id' => '2', 'movie_id' => 3)));
    if ($this->User->UsersWatchlist->saveAll($this->request->data)) {
        $this->Session->setFlash('The movie has been added to your watchlist', 'admin/flash_success');
        $this->redirect($this->referer(array('action' => 'listing')));
    } else {
        $this->Session->setFlash('The movie could not be added to your watchlist. Please, try again.', 'admin/flash_error');
        $this->redirect($this->referer(array('action' => 'listing')));
    }  
}

Así que recibo un error al guardar... Por favor, dime la solución.

preguntado el 03 de mayo de 12 a las 10:05

2 Respuestas

En primer lugar, sus datos deberían verse así (siempre que desee guardarlos a través del modelo de usuario):

$this->request->data = array(
    'User' => array(
        'id' => '2',
    ),
    'Movie' => array(
        'Movie' => array(
            (int) 0 => '3',
        ),
    ),
);

El principal error que veo es que está intentando guardar a través del modelo de unión, donde debería guardar a través del modelo de usuario. Así que en el uso del controlador:

$this->User->saveAll($this->request->data)

Si los datos son como se describe arriba, debería ir bien. Creí haber respondido a tu pregunta. aquí.

Espero que esto ayude. ¡Salud!

contestado el 23 de mayo de 17 a las 12:05

Este formato si funciona. El ['Movie']['Movie'] es la matriz numérica de los ID del modelo correspondiente. - mehov

Tus asociaciones parecen interesantes. ¿Hay alguna razón por la que haya asociado el modelo de combinación HABTM con los dos modelos (usuario, película)? Puede lograr el mismo efecto colocando el primer $HABTM en el modelo de Película y el segundo $HABTM en el modelo de Usuario. No necesita crear el modelo de unión intermedia, cake lo hará por usted, solo necesita la tabla.

Respondido 01 Abr '13, 22:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.