2013-04-24 3 views
0

У меня есть модель Page и модель Category. В принципе, каждая страница относится к категории. Модели настроены так Page belongsTo Category, и Category hasMany Page.hasOne отношения сохранение новой записи вместо существующей

При добавлении новых страниц, я использую это действие контроллера:

public function admin_add() { 
    if($this->request->is('post')) { 
     $this->Page->create(); 
     if($this->Page->saveAssocated($this->request->data)) { 
      $this->Session->setFlash('The page has been created.'); 
      $this->redirect(array('action' => 'index')); 
     } else { 
      $this->Session->setFlash('Unable to save the page.'); 
     } 
    } 
} 

и это мнение для этого действия:

<h1>Add Page</h1> 
<?php 
    echo $this->Form->create('Page'); 
    echo $this->Form->input('Page.title', array('required' => 'required')); 
    echo $this->Form->input('Page.body', array('type' => 'textarea', 'class' => 'redactor', 'required' => 'required')); 
    echo $this->Form->input('Category.name'); 
    echo $this->Form->input('Page.in_header'); 
    echo $this->Form->end('Save Page'); 
?> 

Теперь, когда я сохранить страницу с «Услугами «как категория, все это сохраняется правильно. Страница сохраняется, а категория с name «Услуги» вставлена, и они оба правильно связаны.

Однако, когда я добавляю другую страницу с той же категорией «Услуги», вместо использования существующей записи в таблице categories Торт делает новую и связывает ее. Мне нужно, чтобы он использовал существующую запись.

Как я могу исправить свой просмотр/контроллер/базу данных, чтобы сделать это правильно?

Спасибо!

ответ

0

При создании записей нет места, где вы указываете идентификатор существующей категории. Таким образом, Cake предполагает, что это новая запись, поскольку для поиска нет идентификатора.

Вы должны обеспечить, что идентификатор этой категории, чтобы помочь Cake понимания того, что запись уже существует

Надеется, что это помогает

+0

Хорошо, поэтому в моем контроллере, прежде чем я сохраню страницу, я должен запустить проверку, существует ли категория, и если да, добавьте ее в '$ this-> request-> data'? –

+0

Да, это один из способов сделать это ... Вы также можете добавить раскрывающийся список в представление, чтобы пользователь мог выбрать существующую категорию, и если значение, которое они хотят, отсутствует, они могут указать имя новый. Реализация может быть в любом случае, важно указать ID;) – pollirrata

1

У вас есть несколько решений, чтобы исправить это.

Решение, предлагаемое pollirata, очень хорошее. Предоставление выбора существующими категориями - это самый простой способ узнать, какие категории уже существуют. Наличие простого ввода текста приводит к орфографическим ошибкам в любом случае или к очень похожим названиям категорий, когда вы только этого захотите.

Если вы хотите сохранить ввод текста, то вы должны проверить существующие категории в своей модели Page.php в функции beforeSave(): получить список категорий и сопоставить его с $ this-> data ['Category' ] ['name'] данных, которые вы пытаетесь сохранить. Если существующая категория совпадает, добавьте ее идентификатор в $ this-> data ['Category'] ['id], чтобы Cake не создавал новую запись.

Смежные вопросы