2013-05-02 2 views
3

Я пытался всю ночь, чтобы обновить запись так:CakePHP: Почему я не могу обновить запись с помощью set() или save()?

   $r = $this->Question->read(NULL, $question['Question']['id']); 
       debug($r);// This is a complete Question array 
       $this->Question->set('status', 'version'); 
       $s = $this->Question->save(); 
       //$s = $this->Question->save($r['Question']);//this also doesn't work 
       debug($s); // = False every time!! Why?? 
       exit; 

Два комментарии показывают изменения, которые я пробовал, но не получилось.

@Dipesh:

   $this->data = $this->Question->read(NULL, $question['Question']['id']); 
       $this->Question->status = 'version'; 
       $s = $this->Question->save($this->data); 
       debug($s); 
       exit; 

@Dipesh II:

   $this->request->data = $this->Question->read(NULL, $question['Question']['id']); 
       debug($this->data); 
       //$this->Question->status = 'version'; 
       $this->request->data['Question']['status'] = 'version'; 
       $s = $this->Question->save($this->request->data); 
       //$s = $this->Question->save($r['Question']); 
       debug($s); 
       exit; 

@Dipesh III: (удален)

+0

Есть ли у вас валидации набора для Вопроса? Если да, можете ли вы выполнить 'debug ($ this-> Question-> validationErrors)' сразу после 'debug ($ s)'? – Nunser

+0

Это хорошая идея. Я не знал об этом методе. Но вы видели мой ответ ниже? Не будут ли проверки применимы и к моему решению? – emersonthis

+0

Да, но я предполагаю, что ваше решение работает, потому что, добавляя все данные вручную, вы можете корректно проверять и, следовательно, сохранять вопрос. Отправьте свою модель в свой вопрос и давайте посмотрим, что у нас есть :) – Nunser

ответ

0

Использование $this->data вместо $r

Пример

$this->data = $this->Question->read(NULL, $question['Question']['id']); 

$this->set используется для установки значения переменной и передать его для просмотра, чтобы вид доступа к нему, где в качестве $this->data представляют данные должны быть сохранены в базе данных.

Если вы используете Cake 2.0, замените $this->data, который читается только в Cake 2.0 до $this->request->data.

+0

Это единственное изменение, которое мне нужно внести в мой код? Или я тоже 'save ($ this-> data) '? – emersonthis

+0

Да передайте его '$ this-> data' ... –

+0

Все еще возвращает false. – emersonthis

0

Это не очень «срабатывает само собой», но я был в состоянии получить эту работу так:

$set_perm_id = 42;//who cares 
$data = array(
      'Question'=> array(
         'id'=> $question['Question']['id'], 
         'perm_id'=> $set_perm_id, 
         'status'=>'version' 
         ) 
      ); 
$s=$this->Question->save($data); 

В основном я просто строит массив данных вручную. Если кто-нибудь знает, почему это работает вместо того, что я делал раньше, я бы хотел это услышать.

0

Просто попробуйте эти строки ..

$this->Question->id = $question['Question']['id']; 
$this->Question->set('status','version'); 
$this->Question->save(); 

ИЛИ

$aUpdate["id"] = $question['Question']['id']; 
$aUpdate["status"] = "version"; 
$this->Question->save($aUpdate); 
1

CakePHP обеспечивают метод, называемый набор() в обоих Models::set(), а также в Controller::set();

О Controller::set() Этот метод используется для установки переменных для уровня представления из любого контроллера m енит. Например выборки записей и из моделей и установки их мнения, чтобы отобразить его клиентам, как этот

$data = $this->{ModelName}->find('first'); 
$this->set('dataForView',$data) // now you can access $data in your view as $dataForView 

О модели :: набор() Этот метод используется для установки данных на модели, формат массив, который будет передан, должен быть таким же, как тот, который используется в методе Model :: save(), т.е.как это

$dataFormModel = array('ModelName'=>array('col_name'=>$colValue)); 
$this->{ModelName}->set($dataForModel); 

Model::set() будет принимать его параметр только в этом формате, после успешной установки вы можете сделать следующее

  1. проверка этих данных в отношении правил проверки, указанный в модели непосредственно, как это

    $ isValid = $ this-> ModelName-> validate();

  2. данные/обновления сохранить, вызвав Model::save()

+0

Спасибо. Для Model :: set(), как мы скажем Cake, какую запись мы хотим обновить? Требуется ли еще один параметр для 'WHERE ...'? – emersonthis

+0

Просто установите id модели concerend следующим образом $ this-> Model-> id = $ intVar – sumit

+0

Итак, сначала запустите этот метод id()? Перед установкой() и сохранением()? – emersonthis