Cakephp HABTM объединяет таблицу пустым

Я следую учебник для приложения, в котором пользователи могут загружать файлы и файлы принадлежат определенному пользователю. Между пользователями и Uploads существует связь HABTM следующим образом:

upload.php:

var $hasAndBelongsToMany = array(
    'SharedUser' => array(
        'className' => 'User',
        'joinTable' => 'uploads_users',
        'foreignKey' => 'upload_id',
        'associationForeignKey' => 'user_id',
        'unique' => 'keepExisting'
    )
);

User.php:

var $hasMany = array(
    'Upload' => array(
        'className' => 'Upload',
        'foreignKey' => 'user_id',
        'dependent' => false
    )
);

var $hasAndBelongsToMany = array(
    'SharedUpload' => array(
        'className' => 'Upload',
        'joinTable' => 'uploads_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'upload_id',
        'unique' => true
    )
);

Кажется, что все работает с одним исключением, то есть при создании новой загрузки таблица uploads_users не обновляется. Если я вставляю в него данные вручную, то виды, предназначенные для поиска и отображения данных с использованием этой функции. Может ли кто-нибудь предположить, что не так?

Вот таблица uploads_users:

+-----------+----------+------+-----+---------+----------------+
| Field     | Type     | Null | Key | Default | Extra          |
+-----------+----------+------+-----+---------+----------------+
| id        | int(11)  | NO   | PRI | NULL    | auto_increment |
| upload_id | char(36) | NO   |     | NULL    |                |
| user_id   | char(36) | NO   |     | NULL    |                |
+-----------+----------+------+-----+---------+----------------+

Я немного изменил метод добавления загрузки из учебника (поэтому он удаляет загруженный файл, если сбой базы данных не работает), так что вот что:

function add() {
  if (!empty($this->data)) {
    $this->Upload->create();
    if ($this->uploadFile()) {
      try {
        if (!$this->Upload->saveAll($this->request->data)) {
          throw new Exception('Couldn't save to database.');
        }
        $this->Session->setFlash(__('The upload has been saved', true));
        $this->redirect(array('action' => 'index'));
      }
      catch (Exception $e) {
        unlink(APP . 'tmp/uploads/' . $this->request->data['Upload']['id']);
        $this->Session->setFlash(__('The upload could not be saved: ' . $e->getMessage(), true));
      }
    } else {
      $this->Session->setFlash(__('The upload could not be saved.', true));
    }
  }
  $users = $this->Upload->User->find('list');
  $this->set(compact('users', 'users'));
}

function uploadFile() {
  $file = $this->data['Upload']['file'];
  if ($file['error'] === UPLOAD_ERR_OK) {
    $id = String::uuid();
    if (move_uploaded_file($file['tmp_name'], APP.'tmp/uploads'.DS.$id)) {
      $this->request->data['Upload']['id'] = $id;
      $this->request->data['Upload']['user_id'] = $this->Auth->user('id');
      $this->request->data['Upload']['filename'] = $file['name'];
      $this->request->data['Upload']['filesize'] = $file['size'];
      $this->request->data['Upload']['filemime'] = $file['type'];
      return true;
    }
  }
  return false;
}
1
nl ja de

1 ответы

It would be usefull to see what else is in your request->data. As written in cookbook you should use the related model structure.

Он должен выглядеть следующим образом:

$this->request->data['Upload']['id'] = $id;
$this->request->data['Upload']['user_id'] = $this->Auth->user('id');
...
$this->request->data['SharedUser']['id'] = $this->Auth->user('id');

Также я не мог видеть ваше отношение к отношению, показанное в вашем методе «uploadFile». Возможно, вам это не нужно в модели «Загрузить».

1
добавлено
Спасибо. Кажется, что это была недостающая линия SharedUser, которая была причиной моих проблем.
добавлено автор knirirr, источник