2014-09-24 4 views
3

여러 게임을 데이터베이스의 연속성에 연결하려고합니다.Cakephp 3에서 BelongsToMany 연결 사용하기

나는 연속 테이블, 연속 테이블 게임 및 게임 테이블 3 개가 있습니다. continuities_games 테이블에는 continuity_id와 game_id가 있습니다. 내 선택 입력에서 다른 게임을 선택하려고하면 데이터베이스에 새 게임 항목을 만든 다음 원래 선택한 게임에 연결하지 않고 새 게임 항목에 연결하는 항목을 조인 테이블에 만듭니다.

내 ContinuitiesTable의 초기화 함수이다 :

public function initialize(array $config){ 
    parent::initialize($config); 
    $this->belongsToMany('Games'); 
} 

그리고 내 GamesTable을 위해 :

public function edit($id=null){ 
    $continuity = $this->Continuities->find()->where(['id'=>$id])->contain('Games')->first(); 
    if ($this->request->is(['post', 'put'])) { 
     debug($this->request->data); 
     $continuity->start_date = $this->request->data['start_date']['year'].'-'.$this->request->data['start_date']['month'].'-'.$this->request->data['start_date']['day']; 
     $continuity->end_date = $this->request->data['end_date']['year'].'-'.$this->request->data['end_date']['month'].'-'.$this->request->data['end_date']['day']; 
     //$continuity->start_date = $this->request->data['start_date']; 
     //$continuity->end_date = $this->request->data['end_date']; 

     $continuity->games = $this->request->data['games']; 

     debug($this->Continuities->newEntity($this->request->data)->toArray()); 
     debug($continuity); 
     if ($result = $this->Continuities->save($continuity, ['associated'=>['Games']])) { 
      $this->Flash->success(__('The continuity has been updated.')); 
      return $this->redirect(['action' => 'view', $continuity->id]); 
     } 
     $this->Flash->error(__('Unable to update the continuity.')); 
    } 

    $games = $this->Continuities->Games->getGamesList(); 
    $this->set(compact('continuity', 'games')); 
} 

그리고 마지막으로 :

public function initialize(array $config){ 
    parent::initialize($config); 
    $this->displayField('name'); 
    $this->addBehavior('Tree'); 

    //Associations 
    $this->hasMany('Children', [ 
     'className' => 'Games', 
     'foreignKey' => 'parent_id', 
     'dependant' => true, 
     'cascadeCallbacks' => true, 
    ]); 
    $this->belongsTo('Parent', [ 
     'className' => 'Games', 
    ]); 
    $this->hasMany('Books'); 
    $this->belongsToMany('Continuities'); 
} 

이것은 ContinuitiesController 내 편집 기능입니다 edit.ctp 양식 :

<?= $this->Form->create($continuity) ?> 
    <fieldset> 
     <legend><?= __('Edit Continuity') ?></legend> 
     <?= $this->Form->input('start_date') ?> 
     <?= $this->Form->input('end_date') ?> 
     <?= $this->Form->input('games', ['multiple'=>true]) ?> 
    </fieldset> 
<?= $this->Form->button(__('Submit')); ?> 
<?= $this->Form->end() ?> 

감사합니다.

답변

5

이 작업을 수행하기 위해 몇 가지 사항을 변경해야했습니다.

첫 번째는 연속성 테이블 :

public function initialize(array $config){ 
    parent::initialize($config); 

    $this->belongsToMany('Games', 
     [ 
      'targetForeignKey' => 'game_id', 
      'foreignKey' => 'continuity_id', 
      'joinTable' => 'continuities_games', 
     ]); 
} 

다음, 게임 테이블 : 이제

public function initialize(array $config){ 
    parent::initialize($config); 

    $this->belongsToMany('Continuities', 
     [ 
      'targetForeignKey' => 'continuity_id', 
      'foreignKey' => 'game_id', 
      'joinTable' => 'continuities_games', 
     ]); 
} 

의 ContinuitiesController 편집() 함수 : 마지막으로,

public function edit($id=null){ 
    $continuity = $this->Continuities->find()->where(['id'=>$id])->contain('Games')->first(); 

    if ($this->request->is(['post', 'put'])) { 
     $this->Continuities->patchEntity($continuity, $this->request->data(), ['associated'=>['Games']]); 
     if ($result = $this->Continuities->save($continuity, ['associated'=>['Games']])) { 
      $this->Flash->success(__('The continuity has been updated.')); 
      return $this->redirect(['action' => 'view', $continuity->id]); 
     } 
     $this->Flash->error(__('Unable to update the continuity.')); 
    } 

    $games = $this->Continuities->Games->getGamesList(); 
    $this->set(compact('continuity', 'games')); 
} 

그리고 edit.ctp

<?= $this->Form->create($continuity) ?> 
    <fieldset> 
     <legend><?= __('Edit Continuity') ?></legend> 
     <?= $this->Form->input('start_date') ?> 
     <?= $this->Form->input('end_date') ?> 
     <?= $this->Form->input('games._ids', ['options' => $games, 'multiple'=>true]) ?> 
    </fieldset> 
<?= $this->Form->button(__('Submit')); ?> 
<?= $this->Form->end() ?> 
+0

레이아웃에서'games.ids' ('tablename'._ids)에 대해 언급하지 않으면 이것이 작동하지 않습니다. 대단히 감사합니다. –

관련 문제