[英]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
还有一个用户表。
到目前为止,我的书签模型(Bookmark.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来说还很陌生,所以我不知道这是怎么回事。.当前,如果我在表单中输入数据并点击提交,书签就可以创建好了,但是标签什么也没有发生。 如何将数据保存到关联的联接表和标签表中?
在你看来改变
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(可以修改),不如在控制器中进行设置:
书签控制器.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)) {
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.