在cakephp中编辑关联的模型数据

时间:2014-05-15 07:08:57

标签: cakephp model-associations updatemodel

我正在使用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()表,此表成功获取新值并更新值。

我该怎么办?请帮帮我。

由于

1 个答案:

答案 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) ;

在这里,您知道您引用的UserHolt,标识为33,因此您知道以下数组中的体验是指此用户。但是,如果您未在id数组中指定Experience字段,引擎将如何知道您所引用的体验

如果关系是belongsTo,则可以很容易地推断出与用户Experience相关的Holt(根据关系{{每个用户只有一个Experience 1}}或belongsTo),顺便说一下,你没有嵌套数组。

有多种方法可以告诉您要更新模型的引擎,我使用的是:

  • hasOne数组中设置id值(如上所述)
  • 在您的控制器中设置data值:当您执行$this->Model->id$this->Model->read(就像您这样做)时,会隐含设置此值

我确定,第一个选项适用于相关模型(如上面的$this->Model->find数组,如果您取消注释ID),我不确定是第二个适用于关联模型,比如做data,你可以尝试一下,我现在无法检查它。