如何在CakePHP中添加HABTM记录?

时间:2013-01-10 12:19:18

标签: cakephp cakephp-2.2

我是CakePHP的新手并且有一个相当基本的问题。 我有两个表:booksusersbooksusers有一种关系。我已经为上面创建了MVC。 现在,当用户登录系统时,我希望用户能够通过查看“索引”操作的结果来预订书籍(即books_users中的条目)。要使用的API是什么?

$ this-> Book-> save()似乎不合适,因为我们没有创建一本书。我们只希望现有book与已登录的user之间存在关联。

我试图避免,检索$ this-> Book,手动遍历子数组User,创建一个新的子数组并保存整个事物。我相信必须有一个更简单的方法。

3 个答案:

答案 0 :(得分:1)

您只需将记录保存到包含两者ID的Book或User,它就会将其插入到HABTM表中。

$this->data['User']['id'] = {USER_ID};
$this->data['Book']['id'] = {BOOK_ID};

$this->Book->save($this->data);

查看HABTM表,您将找到该记录。

答案 1 :(得分:1)

改编自Chuck的回答,不确定为什么编辑被推回。


在app / Model / Book.php

class Book extends AppModel {

    /************************************************************************
     * If you want your multiple assoc. to work you must set unique to      *
     * false, otherwise when you save an entry it will enforce unique       *
     * on book ID and subsequently your associations will delete previously *
     * saved associations, acting more like "User HasMany Books".           *
     ************************************************************************/

    var $hasAndBelongsToMany = array(
        'User' => array(
            'className' => 'User',
            'unique' => false                    
    ));

    public function addUser($bid, $uid) {
        $this->data['User']['id'] = $uid;
        $this->data['Book']['id'] = $bid;

        $this->save($this->data);
    }

}

在app / Controller / BooksController.php(或UsersController)

$this->Book->addUser($bid, $uid);

Fat Models / Skinny Controllers。允许重复条目(您需要约束限制并检查重复项,否则默认行为会使HMBTM变得困难)。完全符合您的要求,您只需提供书籍和用户ID。

CakePHP不倾向于鼓励复杂的关联,这是因为HMBTM只是一种方便,在将其与其他关联混合时应该小心,根据下面提供的链接,自定义关联比CakePHP中的HMBTM

http://book.cakephp.org/2.0/en/models/saving-your-data.html#what-to-do-when-habtm-becomes-complicated

答案 2 :(得分:0)

你把你的申请烧了吗?此(基本)功能将提供给您以供您调整。

简而言之 - 获取图书的id和用户的id。将其保存到books_users表格。

id | book_id | user_id
 1         1         1
 2         2         2
 3         2         3

如果您已正确设置关联,当您请求用户时,他们的所有图书都将从联接表中返回。

如果一个人可以同时预订多本书,你的逻辑需要处理 - 可用的书籍数量......

http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-habtm

有一个例子。