CakePHP HABTM添加标签到post-won更新连接表

时间:2014-07-15 00:40:50

标签: cakephp cakephp-2.0

我有Cakephp 2.x应用程序。它是简单的照片库应用程序。我想在现有照片中添加一个或多个新标签。理想情况下,我希望能够从照片中删除标签。

Cakephp HABTM似乎是为此而做的,并承诺完成所有这些。

我使用标准的烘焙编辑照片表单视图和控制器操作,添加了标签列表作为由控制器列表填充的复选框。

这适用于查看该照片的所有现有标签。当我导航到 / app / photos / addtags / id 时,编辑照片表格会填充该照片ID的照片详细信息,以及每个带有复选框的可用标签的完整列表,以及之前选择的任何标签标签被检查。

到目前为止一切都那么好,但我的问题是,如果我检查新标签然后点击提交,它不会更新photos_tag连接表,而只是将新记录添加到照片表。

这是完全出乎意料的行为。我希望它只能将photo_id和tag_id的新记录添加到photos_tag连接表中。

我知道有很多类似的SO问题,我已经在这里以及其他所有人和我可以告诉我的表格,模型,控制器和视图都已正确设置。

我需要帮助提出有关为什么它没有按预期工作的建议。

照片表:

  • ID
  • 文件名
  • ACCOUNT_ID
  • 创建

标签表:

  • ID
  • 标记名
  • ACCOUNT_ID
  • 类别
  • 创建

Photos_Tags表:

  • photo_id
  • TAG_ID

Photo.php

public $hasAndBelongsToMany = array(
    'Tag' => array(
        'className' => 'Tag',
        'joinTable' => 'photos_tags',
        'foreignKey' => 'photo_id',
        'associationForeignKey' => 'tag_id',
        'unique' => 'keepExisting',
        //'with' => 'PhotosTag',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

Tag.php

public $hasAndBelongsToMany = array(
    'Photo' => array(
        'className' => 'Photo',
        'joinTable' => 'photos_tags',
        'foreignKey' => 'tag_id',
        'associationForeignKey' => 'photo_id',
        'unique' => 'keepExisting',
        //'with' => 'PhotosTag',
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )

PhotosController.php

public function addtags($id = null) {
    $this->loadModel('Photo'); 
    if ($this->request->is(array('post', 'put'))) {
        //$this->Photo->id = $id;
        if ($this->Photo->saveAll($this->request->data)) {
            $this->Session->setFlash(__('The photo has been saved.'));
            return $this->redirect(array('action' => 'view', $id));
        } else {
            $this->Session->setFlash(__('The photo could not be saved. Please, try again.'));
        }
    } else {
        $options = array('conditions' => array('Photo.' . $this->Photo->primaryKey => $id));
        $this->request->data = $this->Photo->find('first', $options);
    }
    //$this->request->data = $photo;
    $this->set('tags', $this->Photo->Tag->find('list'));
}

照片编辑表格:

<div class="photos form">
<?php echo $this->Form->create('Photo'); ?>
    <fieldset>
        <legend><?php echo __('Edit Photo'); ?></legend>
    <?php
        echo $this->Form->input('id');
        echo $this->Form->input('account_id', array('type'=>'hidden'));
        echo $this->Form->input('filename');
        echo $this->Form->input('filename_th');
        echo $this->Form->input('desc');
        echo $this->Form->input('Photo.Tag' , array('label'=>'Tags', 'multiple'=>'checkbox'));
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>

print_r($ this-&gt; request-&gt; data):

Array
(
[Photo] => Array
    (
        [id] => 156
        [filename] => front_door_1
        [desc] => 0
        [account_id] => 1
        [user_id] => 
        [created] => 
    )

[Account] => Array
    (
        [id] => 1
        [account] => ABC Bank
        [created] => 2014-06-17
        [modified] => 2014-06-17
    )

[User] => Array
    (
        [id] => 
        [username] => 
        [password] => 
        [first_name] => 
        [last_name] => 
        [role] => 
        [email] => 
        [ip_address] => 
        [activation_code] => 
        [account_id] => 
        [created] => 
        [modified] => 
    )

[Comment] => Array
    (
    )

[Tag] => Array
    (
        [0] => Array
            (
                [id] => 27
                [tagname] => front_door
                [keyname] => 
                [category] => feature
                [account_id] => 1
                [user_id] => 3557
                [created] => 2014-07-12 16:58:44
                [modified] => 
                [PhotosTag] => Array
                    (
                        [id] => 1
                        [photo_id] => 156
                        [tag_id] => 27
                        [account_id] => 1
                        [user_id] => 
                        [created] => 
                    )

            )

        [1] => Array
            (
                [id] => 65
                [tagname] => Surrey_Branch
                [keyname] => 
                [category] => location
                [account_id] => 1
                [user_id] => 3557
                [created] => 2014-07-12 16:58:44
                [modified] => 
                [PhotosTag] => Array
                    (
                        [id] => 32
                        [photo_id] => 156
                        [tag_id] => 65
                        [account_id] => 1
                        [user_id] => 
                        [created] => 
                    )

            )

    )

)
1

1 个答案:

答案 0 :(得分:0)

所以经过几天摆弄这个应用程序后,我创建了基于相同数据库的全新CakePHP应用程序。这是相同的CakePHP版本。但是,新创建的CakePHP HABTM工作得很好。

我可以在照片视图中查看照片标签并编辑表单。我可以在照片中添加/删除标签。

我已经快速回顾了这些CakePHP应用程序之间的代码差异,我看不出任何明显的差异。

我将旧应用中的代码和文件复制并粘贴到新的应用文件夹中,包括整个视图,专用控制器和型号代码。

不能说它们之间有什么区别。

这里的内容是:a)CakePHP HABTM与新近烘焙的应用程序完美配合,b)如果其他人遇到类似问题,建议您尝试快速重新烘焙应用程序。