CakePHP-同时更新多个表
我有一个Cakephp 1.3应用程序正在运行,我有以下设置: 此模型的排放量表:CakePHP-同时更新多个表,php,mysql,sql,cakephp,cakephp-1.3,Php,Mysql,Sql,Cakephp,Cakephp 1.3,我有一个Cakephp 1.3应用程序正在运行,我有以下设置: 此模型的排放量表: class Emission extends AppModel { var $name = 'Emission'; var $displayField = 'name'; } class EmissionMessage extends AppModel { var $name = 'EmissionMessage'; var $belongsTo = array (
class Emission extends AppModel
{
var $name = 'Emission';
var $displayField = 'name';
}
class EmissionMessage extends AppModel
{
var $name = 'EmissionMessage';
var $belongsTo = array
(
'Emission' => array
(
'className' => 'Emission',
'foreignKey' => 'emission_id'
)
);
}
以及一个名为emission_messages的表,该模型:
class Emission extends AppModel
{
var $name = 'Emission';
var $displayField = 'name';
}
class EmissionMessage extends AppModel
{
var $name = 'EmissionMessage';
var $belongsTo = array
(
'Emission' => array
(
'className' => 'Emission',
'foreignKey' => 'emission_id'
)
);
}
emission_消息表有一个外键名为emission_id的字段
当我创建一个新的emission实例时,我需要同时创建一个emission_消息的新实例,也就是说:在我将在数据库中插入一个新emission的形式中,我需要将emission_消息的输入与该相同的emission关联。编辑表单也是如此
我认为我这样做是错误的,因为一旦创建了排放,我就可以“手动”将相关id插入到排放消息表中,但我猜这不是正确的方法,cakePHP应该自动这样做。我不知道如何在表单上命名我的输入,以便正确保存信息,或者如果我的模型错误,这就是它无法工作的原因
编辑:
为了让事情更清楚:Emission和EmissionMessage是一对一的关系,将hasOne添加到Emissions使其工作了一半,我现在可以使用以下方法保存字段:
echo $this->Form->input('EmissionMessage.field');
但是,当我尝试使用edit()操作更新同一条记录时,它只是将数据保存在新行中(使用外键,但保存在新行中,而不是更新上一行)
要保存我使用的字段,请执行以下操作:
$this->Emission->saveAll($this->data)
在编辑()和添加()操作中(插入和更新)
编辑2:似乎EmissionMessage表id的隐藏输入起了作用(我以前做得不正确,一旦我解决了这个问题,它工作得很好),正如这个答案所示:
我觉得很奇怪,我需要添加隐藏的输入,但至少解决了问题。只需按如下方式操作即可-- 然后做表格 就像-- 然后在行动电话中-
$this->Emission->saveAll($this->data); for saving all the data.
点击下面的链接了解更多细节 如果Emission只有一条Emission\u消息,您需要使用
hasOne
关联类型,将您的模型更改为:
class Emission extends AppModel {
var $name = 'Emission';
var $displayField = 'name';
public $hasOne = array(
'EmissionMessage' => array(
'className' => 'Emission_message',
'dependent' => true
)
);
}
及
在您的
Emission中声明$hasMany
,以便与EmissionMessage建立hasMany
关系
class Emission extends AppModel {
var $name = 'Emission';
var $displayField = 'name';
public $hasMany = array('EmissionMessage');
}
Emission
还将保存EmissionMessage
模型的记录,一旦您将数据数组设置为这样。i、 e
$data = array(
'Emission' => array(
'field1' => 'value1',
'field2' => 'value2'
),
'EmissionMessage' => array(
'0' => array(
'field1' => 'value1',
),
'1' => array(
'field1' => 'value1',
),
'2' => array(
'field1' => 'value1',
)
)
);
您可以使用表单帮助器创建上述数组。
$this->Form->create('Emission');
$this->Form->input('Emission.field1');
$this->Form->input('Emission.field2');
$this->Form->input('EmissionMessage.0.field1');
$this->Form->input('EmissionMessage.1.field1');
$this->Form->input('EmissionMessage.2.field1');
$this->Form->submit();
当您提交表单时,您可以在$this->request->data
中从该链接获得类似上述数组的数据,我发现我应该使用echo$this->form->input('EmissionMessage.subject1');但这对我不起作用,我也没有收到错误消息,只是一个空输入,但这对我的模型不正确。每个排放只有一条排放信息。我现在编辑了答案,您可以根据需要申请。希望它能工作这是现在工作添加一个新的项目,但当我编辑相同的项目,它保存为一个新的一次,我不知道为什么?我在edit()和add()操作中都使用了saveAll。我尝试将id添加为隐藏输入,如下所示:但我得到的只是一个空的隐藏选择@Eline Mareley:对于编辑,只需添加这两行即可(因为存在一对一的关系,所以您必须添加这两行)--$this->Form->create('Emission.id')$这个->表单->输入('EmissionMessage.id');在您的ctp文件中,希望它能解决您的问题。如果仍然发生,请告诉我。这不是一个hasMany关系,而是一对一关系,但您在问题中没有提到关联类型
$this->Form->create('Emission');
$this->Form->input('Emission.field1');
$this->Form->input('Emission.field2');
$this->Form->input('EmissionMessage.0.field1');
$this->Form->input('EmissionMessage.1.field1');
$this->Form->input('EmissionMessage.2.field1');
$this->Form->submit();