我正在使用CakePHP 2.3.6。我的项目中有一些模型,它们是关联的,我明确定义了关联。现在,我有一个编辑表单,我在其中检索所有模型数据,并尝试在相应的模型中编辑这些数据。但是,版本没有发生,相反,在关联的表中创建了新行。
以下是我在模型中的关联:
模型User.php
中的:
public $hasMany=array('Education'=>array(
'className'=>'Education
'foreignKey'=>'user_id'
),
'Experience'=>array(
'className'=>'Experience',
'foreignKey'=>'user_id'
),
'Employment'=>array(
'className'=>'Employment',
'foreignKey'=>'user_id'
),
'ProfessionalQualification'=>array(
'className'=>'ProfessionalQualification',
'foreignKey'=>'user_id'
)
)
模型Education.php
中的:
public $belongsTo=array('User'=>array(
'className'=>'User',
'foreignKey'=>'user_id'
)
)
在模型Experience.php
public $belongsTo=array('User'=>array(
'className'=>'User',
'foreignKey'=>'user_id'
)
)
模型Employment.php
中的:
public $belongsTo=array('User'=>array(
'className'=>'User',
'foreignKey'=>'user_id'
)
)
模型ProfessionalQualification.php
中的:
public $belongsTo=array('User'=>array(
'className'=>'User',
'foreignKey'=>'user_id'
)
)
现在,在编辑表单(View/Users/edit.ctp
)中:
echo $this->Form->create('User');
echo $this->Form->input('User.name');
echo $this->Form->input('User.username');
echo $this->Form->input('User.password');
echo $this->Form->input('User.address');
echo $this->Form->input('User.phone');
echo $this->Form->input('Education.0.degree');
echo $this->Form->input('Education.0.passing_year');
echo $this->Form->input('Experience.0.title');
echo $this->Form->input('Experience.0.description');
echo $this->Form->input('Employment.0.company');
echo $this->Form->input('Employment.0.description');
echo $this->Form->input('ProfessionalQualification.0.certificate');
echo $this->Form->input('ProfessionalQualification.0.description');
echo $this->Form->submit('Save');
echo $this->Form->end();
<{1>}控制器中的:
UsersController.php
在这里,我正在public function edit(){
$this->set('title_for_layout','Edit CV');
if(!AuthComponent::user('id'))
throw new NotFoundException(__('Invalid User'));
$user=$this->User->findById(AuthComponent::user('id'));
if(!$user)
throw new NotFoundException(__('Invalid User'));
if($this->request->is('post') || $this->request->is('put')){
if(!$this->User->saveAll($this->request->data)){
$this->Session->setFlash('Sorry, your info could not be saved. Please, try again.');
$this->redirect(array('action'=>'edit'));
}
}
if(!$this->request->data)
$this->request->data=$user;
}
模型上尝试saveAll()
功能。我也尝试使用User
&amp; save()
函数,但结果相同。它不会更改表中的相应行,而是在所有表中创建一个新行,接受saveAssociated()
表,此表成功获取新值并更新值。
我该怎么办?请帮帮我。
由于
答案 0 :(得分:1)
这是一种让它工作的方法(理论上),但我不确定它是最好的,它不是“安全的”:在表单中添加相关字段的id,带有隐藏字段,如下所示:< / p>
echo $this->Form->create('User');
echo $this->Form->hidden('User.id');
echo $this->Form->input('User.name');
/* ... */
echo $this->Form->hidden('Education.0.id');
echo $this->Form->input('Education.0.degree');
/* ... */
echo $this->Form->hidden('Employment.0.id');
echo $this->Form->input('Employment.0.company');
/* ... */
echo $this->Form->submit('Save');
echo $this->Form->end();
您应该检查控制器中关联模型的id
是否与主模型的id
匹配,否则人们将无法编辑与其用户模型无关的关联模型。< / p>
修改:这是有关评论讨论的进一步说明的修改。
如果您有hasMany
关系,请执行以下操作:
public $hasMany = array('Experience') ; // In User class
您必须在保存关系时指定ID,否则Cake引擎无法推断您要更新模型而不是保存模型。
$data = array(
'User' => array(
'id' => 33,
'name' => 'Holt'
),
'Experience' => array(
array(
/* 'id' => 45, */
'name' => 'PHP'
)
)
) ;
$this->User->saveAssociated($data) ;
在这里,您知道您引用的User
是Holt
,标识为33
,因此您知道以下数组中的体验是指此用户。但是,如果您未在id
数组中指定Experience
字段,引擎将如何知道您所引用的体验?
如果关系是belongsTo
,则可以很容易地推断出与用户Experience
相关的Holt
(根据关系{{每个用户只有一个Experience
1}}或belongsTo
),顺便说一下,你没有嵌套数组。
有多种方法可以告诉您要更新模型的引擎,我使用的是:
hasOne
数组中设置id
值(如上所述)data
值:当您执行$this->Model->id
或$this->Model->read
(就像您这样做)时,会隐含设置此值我确定,第一个选项适用于相关模型(如上面的$this->Model->find
数组,如果您取消注释ID),我不确定是第二个适用于关联模型,比如做data
,你可以尝试一下,我现在无法检查它。