hasOne关系保存新记录而不是使用现有记录

时间:2013-04-24 00:59:37

标签: php cakephp models

我有Page模型和Category模型。基本上,每个页面属于一个类别。模型设置为Page belongsTo CategoryCategory hasMany Page

添加新页面时,我正在使用此控制器操作:

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');
?>

现在,当我以“服务”作为类别保存页面时,所有内容都会正确保存。页面将被保存,并且插入了“{1”}“服务”类别,并且它们都可以正常链接。

但是,当我添加具有相同类别“服务”的另一个页面时,而不是使用name表中的现有记录而不是使用新的那个并将其链接起来。我需要它来使用现有记录。

如何修复我的视图/控制器/数据库以使其正常工作?

谢谢!

2 个答案:

答案 0 :(得分:1)

您有多种解决方案可以解决此问题。

pollirata提供的解决方案非常好。提供具有现有类别的选择是用户知道哪些类别已存在的最简单方式。简单的文本输入无论如何都会导致拼写错误,或者当你只需要一个非常相似的类别名称时。

如果您想保留文本输入,那么您应该在beforeSave()函数中检查Page.php模型中的现有类别:检索类别列表并将其与$ this-&gt; data ['Category'匹配] ['name']您要保存的数据。如果现有类别匹配,请在$ this-&gt; data ['Category'] ['id]中添加其ID,以便Cake不会创建新记录。

答案 1 :(得分:0)

创建记录时,您无法指定现有类别的ID。由此,Cake认为它是一个新记录,因为没有用于搜索的ID。

您需要提供该类别的ID,以帮助Cake了解该记录已存在

希望有所帮助