Обновление отношения hasone ведет себя странно (cakephp)

StackOverflow https://stackoverflow.com/questions/2037352

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть существующая витрина, которая hasOne Галерея.Галерея уже существует с помощью ForeignKey. showcase_id установите правильное значение.В Галерее есть текстовое поле, которое я пытаюсь обновить через контроллер Showcase.В результате я получаю дополнительную запись в Галерее наряду с исходной вместо обновления исходной записи.

Что я делаю не так?

Моя витрина выглядит следующим образом:

echo $form->create('Showcase', array('action'=>'update'));

echo $form->input('Showcase.id', array('type'=>'hidden', 'value'=>$showcase['Showcase']['id']));

echo $form->input('Gallery.fulltext', array('type'=>'textarea', 'between'=>'<br>', 'value'=>$showcase['Gallery']['fulltext']));

echo $form->submit('Submit text');

echo $form->end();

Моя функция витрины-контроллера:

$uses = array('Showcase','Gallery')

function update(){

if(!empty($this->data)){

$this->Showcase->saveAll($this->data, array('validate'=>'first'));

}

}

Модель «Витрина» $hasOne = 'Gallery' и модель галереи $belongsTo = 'Showcase'.

Является $this->Showcase->saveAll() какую функцию здесь использовать?Или мне, возможно, нужно обновить запись галереи в контроллере галереи?Это, вероятно, сработает, но это кажется таким неэлегантным.

Это было полезно?

Решение

Я понимаю, что вы подразумеваете под неэлегантностью: было бы неплохо, если бы он понял, что у вас есть отношение hasOne, и поэтому обновил любую существующую запись.

Однако в настоящее время я думаю, что лучшим вариантом будет добавить echo $form->input('Gallery.id', array('type'=>'hidden', 'value'=>$showcase['Gallery']['id'])); на ваш взгляд.

В качестве примечания.В действии контроллера, которое в данный момент определяет $showcase если вместо этого вы назначите его $this->data тогда вам не нужно будет всегда указывать 'value' => ... во входных данных вашей формы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top