我有Cakephp 2.x应用程序。它是简单的照片库应用程序。我想在现有照片中添加一个或多个新标签。理想情况下,我希望能够从照片中删除标签。
Cakephp HABTM似乎是为此而做的,并承诺完成所有这些。
我使用标准的烘焙编辑照片表单视图和控制器操作,添加了标签列表作为由控制器列表填充的复选框。
这适用于查看该照片的所有现有标签。当我导航到 / app / photos / addtags / id 时,编辑照片表格会填充该照片ID的照片详细信息,以及每个带有复选框的可用标签的完整列表,以及之前选择的任何标签标签被检查。
到目前为止一切都那么好,但我的问题是,如果我检查新标签然后点击提交,它不会更新photos_tag连接表,而只是将新记录添加到照片表。
这是完全出乎意料的行为。我希望它只能将photo_id和tag_id的新记录添加到photos_tag连接表中。
我知道有很多类似的SO问题,我已经在这里以及其他所有人和我可以告诉我的表格,模型,控制器和视图都已正确设置。
我需要帮助提出有关为什么它没有按预期工作的建议。
照片表:
标签表:
Photos_Tags表:
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
答案 0 :(得分:0)
所以经过几天摆弄这个应用程序后,我创建了基于相同数据库的全新CakePHP应用程序。这是相同的CakePHP版本。但是,新创建的CakePHP HABTM工作得很好。
我可以在照片视图中查看照片标签并编辑表单。我可以在照片中添加/删除标签。
我已经快速回顾了这些CakePHP应用程序之间的代码差异,我看不出任何明显的差异。
我将旧应用中的代码和文件复制并粘贴到新的应用文件夹中,包括整个视图,专用控制器和型号代码。
不能说它们之间有什么区别。
这里的内容是:a)CakePHP HABTM与新近烘焙的应用程序完美配合,b)如果其他人遇到类似问题,建议您尝试快速重新烘焙应用程序。