CakePHP中表之间的关系

时间:2014-06-13 14:08:51

标签: php cakephp associations

我需要帮助在CakePHP中创建3个表之间的正确关系。这些是:

  1. 用户 - pK = user_id
  2. books - pK = book_id
  3. books_users
  4. 我试图让我的users_books-table包含所有书与用户之间的所有关系,反之亦然,例如:

    ID  |  user_id  |  book_id
    --------------------------
     1      321          231
     2      24           58
     3      80           58
     4      24           75
     5      80           231
    

    我的方法是制作一个hasAndBelongsToMany关系,但是在添加新书时,users_books-table不会填充任何信息。

    在我的控制器中,我尝试过saveAll()和saveAssociated() - 方法,但没有任何效果。

    任何人都可以帮我解决我应该在我的模型中添加哪些关联代码才能使其工作?

    public function addBook() {
        $this->Book->create();
    
        $this->request->data['Book']['book_user_id'] = $this->Auth->user('user_id');
        $data = $this->request->data['Book'];
    
        if (!$data['book_img']['name']) {
            unset($data['book_img']);
        }
    
        if ($this->Book->saveAll($data)) {
            $this->Session->setFlash(__('The book has been saved.'));
            return $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The book could not be saved. Please, try again.'));
        }
    }
    

    新阵列:

    $test = array('User' => $this->Auth->user('user_id'), 'Book' => $data);
    pr($test);
    

    输出:

    Array
    (
    [User] => 4
    [Book] => Array
        (
            [book_study_id] => ha_fil
            [book_title] => The title
            [book_price] => 123
            [book_isbn] => 123
            [book_user_id] => 4
        )
    

    提前致谢,Jesper。

1 个答案:

答案 0 :(得分:1)

你对HABTM很困惑......

如有疑问,请参阅the docs

在那里你有一个如何保存数组

的例子
Array
(
    [Recipe] => Array
        (
            [id] => 42
        )
    [Tag] => Array
        (
            [name] => Italian
        )
)

因此,将其转换为您想要执行的操作,您需要保存此数组...

Array
(
    [User] => Array
        (
            [id] => $this->Auth->user('user_id')
        )
    [Book] => Array
        (
            [name] => book,
            /* your other book stuff */
        )
)

并执行一个简单的$this->save($suggestedBySOArray)来保存关系。

如果您需要更多示例,指向文档的链接有更多关于如何将数据保存到HABTM的示例。

修改

我会添加更多代码,以帮助您走上正确的道路。现在,我假设事情*在这个例子中,因为你的问题没有说:
1)您正在创建新书,而不是更新现有用户与现有书籍之间的关系。
2)你只是添加一本书,而不是很多

$this->Book->create();

 //what did you intent to do with this piece of code btw? you don't have a "book_user_id" column anywhere
//$this->request->data['Book']['book_user_id'] = $this->Auth->user('user_id');

$data = $this->request->data;

if (!$data['Book']['book_img']['name']) {
    unset($data['Book']['book_img']);
}

$data['User']['id'] = $this->Auth->user('user_id');

if ($this->Book->save($data)) {
    $this->Session->setFlash(__('The book has been saved.'));
    return $this->redirect(array('action' => 'index'));
} else {
    $this->Session->setFlash(__('The book could not be saved. Please, try again.'));
}

应该这样做。

现在,请进一步阅读文档,它有示例和所有内容。

另外,如果@Anilkumar怀疑什么是正确的("你正试图只为一个用户添加图书"),请使用hasMany而不是HABTM。