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


hasOne relationship saving new record instead of using existing one

我有一个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');
?>

现在,当我以"Services"作为类别保存一个页面时,它都被正确保存了。页面被保存,name的"服务"类别被插入,它们都被正确地链接起来。

然而,当我添加另一个具有相同类别"服务"的页面时,而不是使用categories表中的现有记录,Cake会创建一个新的记录并链接该记录。我需要它使用现有的记录。

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

谢谢!

您有几个解决方案来解决这个问题。

pollirata提供的解决方案非常好。为现有类别提供一个select,是用户了解哪些类别已经存在的最简单方法。简单的文本输入无论如何都会导致拼写错误或非常相似的类别名称,而您只需要一个。

如果你想保持文本输入,那么你应该检查你的Page.php模型中的beforeave()函数中的现有类别:检索类别列表并将其与你试图保存的数据的$this->data['Category']['name']相匹配。如果一个现有的类别匹配,在$this->data[' category ']['id]中添加它的id,这样Cake就不会创建一个新的记录。

创建记录时,没有指定现有类别id的地方。这样,Cake就假定这是一条新记录,因为没有ID可用于搜索。

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

希望有所帮助