我有一个父/子自我关联表,当id = parent_id时,该id是它自己的父。但是,我无法从添加操作/视图
将数据保存到我的表中从add.ctp视图 - 添加新记录时,我从下拉框中选择parent_id并输入名称。
<?php
echo $this->Form->input('parent_id', array('empty' => 'No Parent'));
echo $this->Form->input('name');
?>
如果用户选择“No Parent”,这意味着我想要parent_id = id,其中id是保存时在DB中自动创建的唯一ID。
当选择“No Parent”时,这是传递给$ this-&gt; request-&gt;数据的内容。
array(
'Item' => array(
'parent_id' => '',
'name' => 'testname'
)
)
我试图在beforeSave中设置parent_id = id,但由于id尚不存在,因此没有任何内容可以指定parent_id。我还尝试先调用“父”模型保存并在控制器中保存saveAll但这些模型也不起作用。
控制器
public function add() {
if ($this->request->is('post')) {
$this->Item->create();
//have tried calling parent model in self association first but
//if ($this->Item->ParentItem->save($this->request->data)) {
if ($this->Item->saveAll($this->request->data)) {
$this->Session->setFlash(__('The item has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The item could not be saved. Please, try again.'));
}
}
Item.php / Model relationship
public $belongsTo = array(
'ParentItem' => array(
'className' => 'Item',
'foreignKey' => 'parent_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
public $hasMany = array(
'ChildItem' => array(
'className' => 'Item',
'foreignKey' => 'parent_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
)
);
如何获取刚创建/保存的ID并将其保存到其他字段,在本例中为parent_id?
更新: 我一直在研究这个问题,并且我使用了getInsertId()来获取最后插入的Id,我试图将其保存到parent_id中,但有一些东西阻止了这一点。我已经删除了所有模型验证,以确保它不是那样。但是Cake(或我的关联设置)中有什么东西不允许parent_id = id(即一行是它自己的父亲吗?
这是我的添加操作中的最新代码...这会将一行保存到数据库中,但不包含parent_id。然后我尝试使用add动作进行编辑并设置parent_id = id,但即使编辑也不允许保存。
public function add() {
if ($this->request->is('post')) {
$this->Item->create();
if ($this->Item->save($this->request->data)) {
$last_id = $this->Item->getInsertId();
$this->Item->saveField('parent_id', $last_id);
$this->Session->setFlash(__('The item has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The item could not be saved. Please, try again.'));
}
}
我也试过调用$ this-&gt; Item-&gt; ParentItem-&gt; save(),saveAll,'deep'=&gt;是的,但仍然没有任何东西允许我更新parent_id列。一行ge
提前致谢
答案 0 :(得分:1)
在您的关联模型中您可以将foregin_key
设置为parent_id
,并自动填充
答案 1 :(得分:0)
所以我遇到的问题...试图在自我连接模型中设置一个parent_id = id(基本上是id它自己的父)是由于我的模型文件中的这段代码
public $actsAs = array('Tree');
再次阅读树行为之后,我意识到$ this-&gt; Model-&gt; save(或saveField)对Tree结构和更新父ID的效果并不理想。应该使用行为功能来形成我的理解。此外,TreeBehavior期望一些parent_ids为null(至少是顶级parent_id),因此如果我将其保留为树,则具有null parent_id的id将被视为父级。
http://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html
“父字段必须能够具有NULL值!如果您只是将顶部元素的父值设置为零,那么它似乎可行,但重新排序树(以及可能的其他操作)将失败。”
所以我需要决定是否要使用树行为或者在不使用Tree的情况下拥有简单的父/子关系...我想稍后会做,因为我不需要多级树,只需要父级和一个级别的孩子。
感谢您的回复。