2013-10-03 76 views
0

我遇到一个问题,CakePHP忽略保存指定的字段,而是创建额外的记录。我正在使用CakePHP 2.3.6。CakePHP SaveAssociated/SaveAll忽略字段

我的表看起来像这样:

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

任何帮助是极大的赞赏试过!谢谢!

回答

0

参考:Cakephp save extra attribute in HABTM relation

对于您的问题,不使用HABTM,因为,HABTM通常用于连接2个表

因此,如果您有超过2个字段,请创建一个模型并使用它,如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'); 
    } 
    } 
} 
+0

感谢您的回复,Patrick。 –

+0

如果我的问题可以帮助你解决问题,请不要忘记投票并标记解决。 –

+0

感谢您的回复,Patrick。 稍有帮助,仍然有点卡住。 现在它仍然创建2条记录,但是第一条记录的'event_id'设置为null'promoter_id',第二条记录的空'event_id'和正确的'promot_id'我仍然在使用它,将很快更新 –