2017-05-24 27 views
0

私はケーキPHPを初めて使っています。私はデータベースを構造化してユーザーが会場にアクティビティを追加できるようにしようとしていますが、会場にすでにその特定のアクティビティがある場合はレコードを追加しません。例えば;あなたも同じactivity.Forと同じ会場を複数回持つことができ、A現時点ではケーキPHPレコードの追加と編集

ローズとクラウン=ピンポン
ローズアンドクラウン=スヌーカー
ローズアンドクラウン=卓球

例。私は仕事をすることができました

public function add() 
{ 
    $venueActivity = $this->VenueActivities->newEntity(); 
    if ($this->request->is('post')) { 
     $venueActivity = $this->VenueActivities->patchEntity($venueActivity, $this->request->data); 
     if ($this->VenueActivities->save($venueActivity)) { 
      $this->Flash->success(__('The venue activity has been saved.')); 

      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The venue activity could not be saved. Please, try again.')); 
     } 
    } 
    $venues = $this->VenueActivities->Venues->find('list', ['limit' => 200]); 
    $activities = $this->VenueActivities->Activities->find('list', ['limit' => 200]); 
    $this->set(compact('venues', 'venueActivity', 'activities')); 
    $this->set('_serialize', ['venueActivities']); 
} 

ローズとクラウン=ピンポン
ローズアンドクラウン=スヌーカー
ローズアンドクラウン=卓球
ローズとクラウン=ピンポンレコードを完全に上書きする方法は、会場のレコードは1つだけです(下記のコードを参照してください)が、同じアクティビティが入力されている場合はレコードを上書きする必要があります。しかし、あなたはすべての異なる活動を持つことができます。

public function add() 
{ 

    $venueActivity = $this->VenueActivities->newEntity(); 
    if($this->request->is('post')) { 

     $venueActivity = $this->VenueActivities->patchEntity($venueActivity, $this->request->data); 

     $oldVenueActivity = $this->VenueActivities->find()->where(['venue_id' => $venueActivity->venue_id]); 

     foreach($oldVenueActivity as $activity) { 
      $this->VenueActivities->delete($activity); 
     } 

     if ($this->VenueActivities->save($venueActivity)) { 
      $this->Flash->success(__('The venue activity has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The venue activity could not be saved. Please, try again.')); 
     } 
    } 

    $venues = $this->VenueActivities->Venues->find('list', ['limit' => 200]); 
    $activities = $this->VenueActivities->Activities->find('list', ['limit' => 200]); 
    $this->set(compact('venues', 'venueActivity', 'activities')); 
    $this->set('_serialize', ['venueActivities']); 
} 

ありがとうございます。

答えて

1

この特定の問題については、あなたのアプローチを考え直すことを検討してください。

あなたの現在の状況:会場、アクティビティ、会場の活動状況VenueActivitiesでは、会場とアクティビティに一緒に参加しています。

私の意見では、あなたはすべきこと:VenuesとActivitiesのみをベイクし、それらのテーブルクラスにbelongsToManyアソシエーションを設定します。その後、manage_activities.ctpに

public function manageActivities($id = null){ 
    $venue = $this->Venues->get($id); 
    if($this->request->is(['post','put'])){ 
     //patch entity and save 
    } 
    $activities = $this->Venues->Activities->find('list'); 
    $this->set(compact('venue','activities'); 
} 

:上記

$this->Form->input('activities._ids', ['multiple' => 'checkbox']); 

コードが活動のマルチ選択可能なリストになります次に、VenueControllerに、あなたは、例えば、manageActivities関数を作成することができます。追加アクティビティを確認する場合は、そのアクティビティとの関連付けが追加されます。既存のアクティビティのチェックを外すと、この特定のアクティビティとの関連付けは削除され、選択されたアクティビティの残りの部分は保存されます。

追加情報:https://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations

関連する問題