CakePHP SaveAssociated / SaveAll игнорирование полей

У меня возникла проблема, когда CakePHP игнорирует сохранение указанного поля и вместо этого создает дополнительные записи. Я использую CakePHP 2.3.6.

Моя таблица выглядит так:

CREATE TABLE `events_guests` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `guest_id` int(11) NOT NULL,
  `event_id` int(11) NOT NULL,
  `promoter_id` int(11) DEFAULT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `attended` varchar(15) NOT NULL DEFAULT 'No',
  PRIMARY KEY (`id`)
)

Вот код

public function addGuest($event_id, $promoter_id = null) {
if ($this->request->is('post')) {
                $this->Guest->create();
                $event_data = array('event_id' => $event_id);
                $data = $this->request->data;
                $data['Event'] = $event_data;
                if($promoter_id) {
                    $data['Event']['promoter_id'] = $promoter_id;
                }
                if ($this->Guest->saveAssociated($data)) {
                    $this->Session->setFlash(__('The guest has been added to the guestlist'), 'flash/success');
                } else {
                $this->Session->setFlash(__('The guest could not be saved. Please, try again.'), 'flash/error');
                }

Вот мои данные, которые я пытаюсь сохранить:

Array (
  [Guest] => Array
    (
      [first_name] => Joe
      [last_name] => Schmoe
    )
  [Event] => Array
    (
       [event_id] => 1
       [promoter_id] => 2
    )
)

Мои модели следуют:

class Guest extends AppModel {
public $hasAndBelongsToMany = array(
        'Event' => array(
            'className' => 'Event',
            'joinTable' => 'events_guests',
            'foreignKey' => 'guest_id',
            'associationForeignKey' => 'event_id',
            'unique' => 'true',
        ), 
        'Promoter' => array(
            'className' => 'Promoter',
            'joinTable' => 'events_guests',
            'foreignKey' => 'guest_id',
            'associationForeignKey' => 'promoter_id',
            'unique' => 'true',
        )
    );
}

И

class Event extends AppModel {
public $hasAndBelongsToMany = array(
        'Guest' => array(
            'className' => 'Guest',
            'joinTable' => 'events_guests',
            'foreignKey' => 'event_id',
            'associationForeignKey' => 'guest_id',
            'unique' => 'keepExisting',
            'order' => 'last_name',
        ),
        'Promoter' => array(
            'className' => 'Promoter',
            'joinTable' => 'events_promoters',
            'foreignKey' => 'event_id',
            'associationForeignKey' => 'promoter_id',
            'unique' => 'keepExisting',
        )
    );
}

Результатом этого являются 2 записи для EventsGuests, ни с promoter_id.

Одна запись получает event_id = 1 КАК ОЖИДАЕТСЯ

Другая запись получает event_id = 2, что на самом деле является promoter_id

Я пробовал использовать смесь saveAssociated и saveAll.

Любая помощь приветствуется! Спасибо!


person Bryan Zwicker    schedule 03.10.2013    source источник


Ответы (1)


Ссылка: Cakephp сохраняет дополнительный атрибут в отношении HABTM

Для вашей проблемы не используйте HABTM, потому что HABTM обычно используется для соединения двух таблиц.

Итак, если у вас более двух полей, создайте модель и используйте ее как отношения belongsTo и hasMany.

class Event extends AppModel {

  $hasMany = array(
    'EventGuest' => array(
      'className' => 'EventGuest',
      'foreignKey' => 'event_id'    
    )
  );

}

class Guest extends AppModel {

  $hasMany = array(
    'EventGuest' => array(
      'className' => 'EventGuest',
      'foreignKey' => 'guest_id'    
    )
  );

}

class Promoter extends AppModel {

  $hasMany = array(
    'EventGuest' => array(
      'className' => 'EventGuest',
      'foreignKey' => 'promoter_id'    
    )
  );

}

Теперь ваша модель отношений.

class EventGuest extends AppModel {

  $belongsTo = array(
    'Event' => array(
      'className' => 'Event',
      'foreignKey' => 'event_id'
    ),
    'Guest' => array(
      'className' => 'Guest',
      'foreignKey' => 'guest_id'
    ),
    'Promoter' => array(
      'className' => 'Promoter',
      'foreignKey' => 'promoter_id'
    )
  );

}

И продолжайте использовать свой код.

public function addGuest($event_id, $promoter_id = null) {
  if ($this->request->is('post')) {
    $this->Guest->create();
    $event_data = array('event_id' => $event_id);
    $data = $this->request->data;
    $data['Event'] = $event_data;
    if($promoter_id) {
      // EDITED
      $data['Promoter']['promoter_id'] = $promoter_id;
    }

    if ($this->Guest->saveAssociated($data)) {
      $this->Session->setFlash(__('The guest has been added to the guestlist'), 'flash/success');
    } else {
      $this->Session->setFlash(__('The guest could not be saved. Please, try again.'), 'flash/error');
    }
  }
}
person Patrick Maciel    schedule 03.10.2013
comment
Если мой вопрос поможет вам и решит вашу проблему, не забудьте проголосовать и отметить как решенный. - person Patrick Maciel; 03.10.2013
comment
Спасибо за ответ, Патрик. Это немного помогло, все еще немного застрял. Теперь он по-прежнему создает 2 записи, но первая запись имеет набор event_id с нулевым promoter_id, а вторая запись имеет нулевой event_id и правильный promoter_id. Я все еще работаю с ним, скоро обновлю - person Bryan Zwicker; 03.10.2013
comment
Вы можете отредактировать свой вопрос и поставить свои отношения массива моделей? Просто любопытно. - person Patrick Maciel; 03.10.2013
comment
Да, я только что добавил ассоциации моделей. До сих пор это не работает. Большое спасибо, что посмотрели это вместе со мной! - person Bryan Zwicker; 04.10.2013
comment
@BryanZwicker Я обновляю свой ответ, посмотри и скажи мне, работает ли он сейчас. Я думаю, это лучшее решение. - person Patrick Maciel; 04.10.2013