2017-05-24 1 views
0

Donc, je suis nouveau pour gateau PHP. J'essaie de structurer ma base de données afin qu'un utilisateur puisse ajouter une activité à un lieu, mais si le lieu a déjà cette activité particulière, il n'ajoute pas l'enregistrement. Par exemple;Gâteau PHP ajoutant et éditant un enregistrement

Rose et couronne = Pin-Pong
Rose and Crown = billard
Rose and Crown = tennis de table

Au moment de vous pouvez avoir plusieurs fois le même des sites, même avec le même activity.For Exemple;

Rose et couronne = Pin-Pong
Rose and Crown = billard
Rose and Crown = tennis de table
Rose et couronne = Pin-pong

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']); 
} 

Je suis en mesure de travailler comment écraser complètement l'enregistrement pour qu'il n'y ait plus qu'un seul enregistrement pour le lieu (voir le code ci-dessous) mais j'en ai besoin pour écraser seulement l'enregistrement si la même activité a été entrée. Mais vous pouvez avoir toutes les différentes activités.

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']); 
} 

Merci d'avance.

Répondre

1

S'il vous plaît envisager de repenser votre approche pour ce problème particulier.

Ce que vous avez en ce moment: les lieux, les activités et les activités du lieu. Vous opérez sur VenueActivities, pour rejoindre le lieu et l'activité ensemble. Qu'est-ce (à mon avis) que vous devriez faire: faire cuire seulement des lieux et des activités, et configurer pour eux l'association belongsToMany dans leurs classes de table. Puis, en VenueController, vous pouvez créer, par exemple, la fonction de manageActivities:

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

Puis, en manage_activities.ctp:

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

code ci-dessus entraînera la liste multi-sélectionnable des activités. Si vous allez vérifier l'activité supplémentaire, l'association avec elle sera ajoutée. Si vous désélectionnez celui existant, l'association avec cette activité particulière sera supprimée et le reste des activités sélectionnées sera conservé.

Information additionnelle: https://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations