2012-02-12 2 views
1

Это довольно простой вопрос о CakePHP, но поскольку мои знания об этой структуре довольно ржавые, это заставляет меня терять много времени.Работа с родственной моделью в CakePHP

У меня есть отношение ManyToMany между Guest и Present. Всякий раз, когда новый Гость создается и ассоциируется с подарком, я хотел бы отметить Присутствие как взятое. Если настоящее уже сделано, возникает некоторая ошибка. Причина, почему я не просто заявляю, что Гость имеет множество подарков, потому что в будущем все может измениться, и более одного гостя может ассоциироваться с настоящим, поэтому я предпочитаю избегать миграции Db.

My Guest::add() Действие выглядит следующим образом. Он вызывается с POST с данными нового гостя и идентификатором существующего настоящего.

public function add() { 
    if ($this->request->is('post')) { 
     $id = $this->request->data['Present']['id']; 
     $this->Guest->create(); 
     $present = $this->Guest->Present->findById($id); 
     if ($present['Present']['taken']) { 
      throw new ForbiddenException(); 
     } 

     if ($this->Guest->save($this->request->data)) { 
      if ($this->Guest->Present->saveField('taken', true)) { 
       // Give the guest a uuid and proceed with a welcome message 
       $this->Guest->read(); 
       $this->set('uuid', $this->Guest->data['Guest']['uuid']); 
      } 
     } 

    } 
    else { 
     throw new ForbiddenException(); 
    } 
} 

Что происходит, что новый гость создается (правильный) и связанный с данным присутствуют (правильно), но когда я сохранить taken поля нового настоящее создано вместо модификации данного.

Каков правильный способ для обновления текущего настоящего?

Если какой-либо помощи, я использую CakePHP 2.0

ответ

2

Для получения данных модели с помощью первичного ключа, что лучше использовать Тейн дополнение read метод:

$present = $this->Guest->Present->read(null, $id); 

метод чтения устанавливает атрибут id модели, чтобы дальнейшие вызовы других методов влияли на одну и ту же запись данных, а не на создание новой. Это должно решить проблему, с которой вы сталкиваетесь.

Model callbacks, как правило, лучше подходит для этих ситуаций. Вы можете добавить обратный вызов beforeSave к классу Guest, чтобы проверить, выполнено ли уже существующее, и не разрешать создание, если оно есть. Таким образом, модельная логика остается на уровне модели, и вам не нужно выполнять какую-либо дополнительную работу, например. если ограничение должно быть принудительно применено также, когда существующие Guest s сохранены или созданы из разных контроллеров или действий.

1

Похоже, что идентификатор модели, которую вы пытаетесь сохранить, теряет объем. Вы должны решить проблему, обновив код:

... 
if ($this->Guest->save($this->request->data)) { 
    $this->Guest->Present->id = $id; 
    if ($this->Guest->Present->saveField('taken', true)) { 
... 
Смежные вопросы