我有一个Page
模型和一个Category
模型。基本上,每个页面都属于一个类别。分别建立了Page belongsTo Category
和Category 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理解该记录已经存在
希望有所帮助