CakePHP - 同时更新多个表

时间:2014-01-10 11:41:38

标签: php mysql sql cakephp cakephp-1.3

我有一个Cakephp 1.3应用程序,我有以下设置:

使用此模型称为排放的表格:

class Emission extends AppModel
{
    var $name = 'Emission';
    var $displayField = 'name';
}

这个模型名为emission_messages的表格:

class EmissionMessage extends AppModel
{
    var $name = 'EmissionMessage';

    var $belongsTo = array
    (
        'Emission' => array
        (
            'className' => 'Emission',
            'foreignKey' => 'emission_id'
        )
    );

}

emission_message表有一个名为emit_id的字段用于外键。

当我创建一个新的发射实例时,我需要同时创建一个新的emission_message实例,即:在我将在数据库中插入新发射的形式中,我需要输入emission_message与相同的排放有关。编辑表单也是如此。

我认为我这样做是错误的,因为一旦创建了发射,我就可以“手动”插入具有相关id的emission_message表但是我猜这不是正确的方式而且cakePHP应该做这是自动的。我不知道如何在表单上命名我的输入,以便正确保存信息或者我的模型是错误的,这就是为什么它不起作用。

编辑:

为了使事情变得更清楚:Emission和EmissionMessage是一对一的关系,将hasOne添加到Emissions让它工作一半,我现在可以使用以下方法保存字段:

 echo $this->Form->input('EmissionMessage.field'); 

但是当我尝试更新同一条记录时,edit()动作只是将数据保存在一个新行中(使用外键,但是在新行中,而不是更新前一行)

要保存我使用的字段:

$this->Emission->saveAll($this->data)

edit()和add()动作(插入和更新)

编辑2:似乎隐藏的输入与EmissionMessage表的id做了伎俩(之前我没有正确地做,一旦我修复它,它工作正常),因为这个答案表明:saveAll() inserts new row instead of updating < / p>

我觉得很奇怪,我需要添加隐藏的输入,但至少可以解决问题。

3 个答案:

答案 0 :(得分:1)

只是按照 -

的方式做事情
class Emission extends AppModel
{
    var $name = 'Emission';
    var $displayField = 'name';
var $hasOne = array('EmissionMessage' => array
        (
            'className' => 'EmissionMessage',
            'foreignKey' => 'emission_id'
        ));
} 

然后制作表格。

喜欢 -

$this->Form->create('Emission');
$this->Form->input('Emission.id'); 
$this->Form->input('Emission.fieldsname');
$this->Form->input('EmissionMessage.id');
$this->Form->input('EmissionMessage.fieldsname2');
$this->Form->input('EmissionMessage.fieldsname3');
$this->Form->submit();

然后在动作调用中 -

$this->Emission->saveAll($this->data); for saving all the data.

通过以下链接了解更多详情。 http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Models.html

答案 1 :(得分:0)

如果Emission只有一个Emission_message,则需要使用hasOne关联类型,将模型更改为:

class Emission extends AppModel {
    var $name = 'Emission';
    var $displayField = 'name';
    public $hasOne = array(
        'EmissionMessage' => array(
            'className' => 'Emission_message',
            'dependent' => true
        )
    );
}

class EmissionMessage extends AppModel {
    public $belongsTo = array(
        'Emission' => array(
            'className' => 'Emission',
            'foreignKey' => 'emission_id'
        )
    );
}

答案 2 :(得分:-1)

$hasMany中声明EmissionhasMany建立EmissionMessage

class Emission extends AppModel {
    var $name = 'Emission';
    var $displayField = 'name';

    public $hasMany = array('EmissionMessage');
}
一旦你把这样的数据数组放在一起,

Emission也会保存EmissionMessage模型的记录。即

$data = array(
    'Emission' => array(
        'field1' => 'value1',
        'field2' => 'value2'
    ),
    'EmissionMessage' => array(
        '0' => array(
            'field1' => 'value1',
        ),
        '1' => array(
            'field1' => 'value1',
        ),
        '2' => array(
            'field1' => 'value1',
        )
    )
);

您可以使用form helper.

创建一个上面的数组
$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中获取上述数组中的数据。