2013-05-05 68 views
0

我試圖建立一個簡單的書籤網站作爲一個項目來學習一些CakePHP,但我很難找出如何做HABTM(或任何我可能需要)書籤/標籤。CakePHP 2.X: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> 

正如我所說的,我很新的蛋糕,所以我不知道這裏發生了什麼事情。目前,如果我將數據輸入到該表單並點擊提交,書籤就會被創建得很好,但標籤沒有任何變化。如何將數據保存到關聯的連接表和標籤表中?

+0

首先,你所提到的是你的「控制器',實際上是你的'模特',當然這可能是一個錯字。那些在'模型'目錄裏面?另外,你可以發佈你的BookmarkController的相關代碼嗎? – thaJeztah 2013-05-05 17:48:16

+0

對不起 - 控制器位是一個錯字,很晚了。它們在Model目錄中。爲了讓項目能夠正常工作(這是爲了一個類...我選擇使用cakephp來體驗它,儘管該任務指定了php - 所以現在我使用了一些可怕的cakephp標準並在大部分模型工作中使用query())。所以我當前的BookmarkController甚至沒有利用添加中的HABTM - 我現在手動完成它。但原來看起來像if($ this-> Bookmark-> saveAll($ this-> request-> data)){...} – Yair 2013-05-06 18:08:39

回答

1

在你看來變化

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約定,您不需要n用來指定關係的參數;

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)) { 
      ...