2013-05-05 2 views
0

CakePHP를 배우는 프로젝트로 간단한 북마크 사이트를 만들려고하지만 HABTM을 수행하는 방법을 알아내는 데 큰 어려움을 겪고 있습니다. 내가 할 수도 있습니다) 즐겨 찾기/태그.CakePHP 2.X : 즐겨 찾기/태그가있는 HABTM, 같은 양식에서 저장

새로운 북마크를 만드는 데 사용되는 '제목', 'URL', '태그'필드가있는 간단한 양식이 있습니다.

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', 
    ) 
); 

그리고 일부 확인. 그래서 난 케이크에 내가 말했듯이

<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> 

, 난 아주 새로운 :

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', 
    ) 
    ); 

프론트 엔드의 형태로 지금까지 다음과 같습니다처럼

태그 모델 본다 여기에 무슨 일이 일어나고 있는지 확실하지 않습니다. 현재 내가 해당 양식에 데이터를 입력하고 책갈피를 제출하면 태그가 올바르게 생성되지만 아무 것도 태그가 발생하지 않습니다. 연결된 조인 테이블과 태그 테이블에 데이터를 저장하려면 어떻게합니까? 당신의 변경보기에서

+0

첫째, 당신이 당신의 '컨트롤러로 언급 한 것 :

오히려 수정 될 수있는 형태로 사용자 ID를 설정하는 것보다, 컨트롤러에서 설정 ', 실제로는'모델 '입니다. 물론 오타가 될 수 있습니다. 그것들은 'Model'디렉토리 안에 있습니까? 또한, BookmarkController의 관련 코드를 게시 할 수 있습니까? – thaJeztah

+0

죄송합니다 - 컨트롤러 비트가 오타되었습니다, 아주 늦었습니다. 모델 디렉토리 안에 있습니다. 이후로 프로젝트를 작동시키기 위해 약간 옮겼습니다 (클래스를위한 것입니다 ... 과제는 PHP에서 지정 했음에도 불구하고 cakephp를 사용하기로 결정했습니다 - 그래서 지금은 끔찍한 cakephp 표준을 사용하고 있습니다. 그리고 모델 작업의 많은 부분에 대해 query()를 사용합니다.그래서 현재의 BookmarkController는 add에서 HABTM를 이용하지 않고 있습니다. 저는 수동으로하고 있습니다. 하지만 원본은 if ($ this-> Bookmark-> saveAll ($ this-> request-> data))와 같이 보였다. – Yair

답변

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 관계에 대한 매개 변수를 지정하는 eed;

public $hasAndBelongsToMany = array('Tag'); 

public $hasAndBelongsToMany = array('Bookmark'); 

은 충분하다.

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