0

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

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

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

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

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

Вот часть Model Book:

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)); 
+0

Вы должны иметь ** Книга hasMany комментарий **. У вас есть ** Книга HABTM Comment **. – AgRizzo

+0

Можете ли вы показать код, в котором вы пытаетесь сохранить данные и структуру массива, который вы сохраняете? – GatorGuy023

+0

Я пробовал оба saveAll, saveAssociated, но не повезло. – pt0

ответ

1

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

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

Смотрите эту ссылку: Saving HABTM

+0

'Массив ( [Книга] => Массив ( [название] => title125 [автор] => title625 ) [Пользователь] => Массив ( [ID] => 4 ) [Комментарий] => Массив ( [тело] => см: 507 ) ) ' – pt0

+0

Я думаю, что проблема здесь mulitiple ключи индексации в одной таблице. – pt0

+0

по-моему проблема находится внутри модели Комментарий. Я понимаю, что это таблица соединений, но первичные ключи должны быть comment_id и book_id, и тогда у вас будет другой внешний ключ с именем user_id, который является ссылочным идентификатором пользователя. Если я хорошо понимаю, вам не нужно использовать HABTM-модель, а модель Has Many Through, потому что у вас не только два первичных ключа внутри модели, но и другая информация пользователя. См. Ссылку: [ссылка] (http://book.cakephp.org/2.0/ru/models/associations-linking-models-together.html#hasmany-through-the-join-model) – Laura