4

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

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

我试图避免,检索 $this->Book,手动迭代子数组User,创建一个新的子数组并将整个内容保存回来。我相信一定有一个更简单的方法。

4

3 回答 3

2

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


在 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);

胖模型/瘦控制器。允许重复条目(您需要限制限制并检查重复项,否则默认行为会使 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

于 2014-01-04T06:09:53.270 回答
1

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

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

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

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

于 2013-01-16T16:14:35.803 回答
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

有一个例子。

于 2013-01-10T13:36:56.997 回答