CakePHP 2.X: HABTM与书签/标签,从相同的形式保存


CakePHP 2.X: HABTM with Bookmarks / Tags, saving from same form

我试图建立一个简单的书签网站作为一个项目来学习一些CakePHP,但我有很大的麻烦弄清楚如何做HABTM(或任何我可能需要)的书签/标签。

我有一个简单的形式,其中有字段'Title', 'Url', 'Tags',这是用来创建一个新的书签。

我的表设置如下:

bookmarks: id (primary), uid, title, url, private (boolean), time
tags: id (primary), tag
bookmarks_tags: id (primary), bookmark_id, tag_id

还有一个users表

到目前为止,我的书签模型(书签。php)非常简单,看起来像:
class Bookmark extends AppModel {
public $name = "Bookmark";
public $displayField = 'name';
public $hasAndBelongsToMany = array(
    'Tag' => array(
            'className' => 'Tag',
            'joinTable' => 'bookmarks_tags',
            'foreignKey' => 'bookmark_id',
            'associationForeignKey' => 'tag_id',
            'unique' => 'keepExisting',
    )
);

然后进行验证。

标签模型如下:

class Tag extends AppModel {
public $name='Tag';
public $displayField = 'name';
public $hasAndBelongsToMany = array(
    'Bookmark' => array(
            'className' => 'Bookmark',
            'joinTable' => 'bookmarks_tags',
            'foreignKey' => 'tag_id',
            'associationForeignKey' => 'bookmark_id',
            'unique' => 'keepExisting',
    )
    );

到目前为止,前端的表单看起来像这样:

<div id="addBookmark" class="card">
            <div id="addBookmarkTopSpan" class="topSpan">add new bookmark</div>
            <?php echo $this->Form->create(null, array('url' => array('controller' => 'bookmarks', 'action' => 'add'))); ?>
            <fieldset>
                <?php echo $this->Form->input('Bookmark.title');
                    echo $this->Form->input('Bookmark.url');
                    echo $this->Form->input('Bookmark.private', array('type' => 'checkbox'));
                    echo $this->Form->input('Bookmark.uid', array('type' => 'hidden', 'value' => $user['User']['id']));
                    echo $this->Form->input('Bookmark.Tag');
                    ?>
            </fieldset>
            <?php echo $this->Form->end(__('Submit')); ?>
    </div>

就像我说的,我对Cake很陌生,所以我不确定这里发生了什么……目前,如果我在表单中输入数据并点击提交,书签就会创建得很好,但标签什么也没发生。如何将数据保存到关联的联接表和Tags表中?

在您的视图更改

echo $this->Form->input('Bookmark.Tag');

echo $this->Form->input('Tag.id');

echo $this->Form->input('Tag.0.id');
echo $this->Form->input('Tag.1.id');
echo $this->Form->input('Tag.2.id');
...

关于你的代码的一些旁注…

由于您遵循CakePHP约定,因此不需要为关系指定参数;

public $hasAndBelongsToMany = array('Tag');

public $hasAndBelongsToMany = array('Bookmark');

就足够了。

与其在表单中设置用户ID,还不如在控制器中设置:

BookmarksController.php

public function add() {
    if ($this->request->is('post')) {
        $this->request->data['Bookmark']['uid'] = $this->Auth->user('id');
        if ($this->Note->save($this->request->data)) {
            ...