Правильные ассоциации моделей в cakephp

Я использую HABTM для заполнения базы данных. Имею 3 модели. Пользователь, книга, комментарий. Чтобы объединить записи в таблицах книги и пользователей, которые я использую в таблице HABTM users_books, и для привязки комментариев я использую 2 первичных ключа, user_id и book_id, которые оба установлены как внешний ключ:

PRIMARY KEY (user_id, book_id)
FOREIGN KEY (user_id, book_id) REFERENCES users_books (user_id, book_id)

Заполняются таблицы books и users_books, но в некоторых случаях я могу заполнить таблицу комментариев, но только с user_id и book_id, остальные данные - NULL. Или, если я удалю user_id (массив комментариев) из полученного мной запроса saveAll:

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails 

Так что я предполагаю, что это либо противоречит конвенциям cakephp, либо я что-то делаю не так.

Вот часть Модельной книги:

  public $hasAndBelongsToMany = array(
  'User' =>
  array(
    'className' => 'User',
      'joinTable' => 'users_books',
        'foreignKey' => 'book_id',
        'associationForeignKey' => 'user_id',
        'unique' => true,
    'conditions' => '',
    'fields' => 'book_id',
    'order' => '',
    'limit' => '',
    'offset' => '',
    'finderQuery' => '',

),
'Comment' =>
array(
  'className' => 'Comment',
  'joinTable' => 'comments',
  'foreignKey' => 'book_id',
  'associationForeignKey' => 'user_id',
  'unique' => true,
  'conditions' => '',
  'fields' => '',
  'order' => '',
  'limit' => '',
  'offset' => '',
  'finderQuery' => '',),);

И комментарий:

public $belongsTo = array (
'Book' => array (

'foreignKey'=>false,
'conditions'=> array('Comment.book_id = UserBook.book_id')));

редактировать:

Данные для сохранения

$this->request->data['Book']['title'] = "title".rand(1,1220);
$this->request->data['Book']['author'] = "author".rand(1,1220);
$this->request->data['User']['id'] = $this->Auth->user('id');
$this->request->data['Book']['Comment']['body'] = "cm: ".rand(1,1220);
$this->Book->save($this->request->data, array('deep'=>TRUE));

И вызов сохранения:

  $this->Book->saveAll($this->request->data, array('deep'=>TRUE));

person pt0    schedule 05.02.2015    source источник
comment
У вас должно быть в книге много комментариев. У вас есть комментарий к книге HABTM.   -  person AgRizzo    schedule 05.02.2015
comment
Можете ли вы показать код, в котором вы пытаетесь сохранить данные и структуру массива, который вы сохраняете?   -  person GatorGuy023    schedule 05.02.2015
comment
Я пробовал как saveAll, так и saveAssociated, но безуспешно.   -  person pt0    schedule 06.02.2015
comment
Могу только подтвердить то, что сказал AgRizzo. Использование HABTM просто неправильно   -  person conehead    schedule 06.02.2015


Ответы (1)


Я думаю, что массив данных запроса находится в неправильной форме для правильного сохранения cakephp. Можете выложить массив? вы можете добавить эту строку перед функцией save ():

pr($this->request->data);

См. Эту ссылку: Сохранение HABTM

person Laura    schedule 06.02.2015
comment
Думаю, проблема здесь в нескольких ключах индексации в одной таблице. - person pt0; 07.02.2015
comment
на мой взгляд, проблема в комментарии к модели. Я понимаю, что это таблица соединений, но первичными ключами должны быть comment_id и book_id, и тогда у вас будет другой внешний ключ с именем user_id, который является ссылочным идентификатором пользователя. Если я хорошо понимаю, вам не нужно использовать модель HABTM, а модель Has Many Through, потому что у вас есть не только два первичных ключа внутри модели, но и другая информация о пользователе. См. Ссылку: [ссылка] (book.cakephp.org/2.0/en/models/) - person Laura; 09.02.2015
comment
Спасибо, что указали на это. Я думал, что HABTM было достаточно, чтобы установить соединение, но правильным ответом был HMT, и у меня были искаженные данные, пока я пытался сохранить их в базе данных. Итак, я голосую за первый из ваших ответов. Ваше здоровье - person pt0; 09.02.2015