cakeCake PHP добавление и редактирование записи

Так что я новичок в торте 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']);
}

Мне удалось выяснить, как полностью перезаписать запись, так что это только одна запись для места (см. Код ниже), но мне нужно, чтобы она перезаписывала запись только в том случае, если была введена та же активность. Но вы можете иметь все различные виды деятельности.

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

Заранее спасибо.

0

Решение

Пожалуйста, подумайте о переосмыслении вашего подхода к этой конкретной проблеме.

Что у вас есть сейчас: места проведения, мероприятия и venue_activities. Вы работаете на VenueActivities, чтобы присоединиться к месту проведения и деятельности вместе.

Что (по моему мнению) вы должны сделать: выпекать только Места и Действия, и настройка для них принадлежит ассоциации ToMany в их классах Table. Затем в VenueController вы можете создать, например, функцию 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');
}

Затем в manage_activities.ctp:

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

Приведенный выше код приведет к множественному выбору списка действий. Если вы проверите дополнительную активность, ассоциация с ней будет добавлена. Если вы снимите флажок с существующего, связь с этим конкретным действием будет удалена, а остальные из выбранных будут сохранены.

Дополнительная информация: https://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector