0
votes

I have a Cakephp 1.3 app working and I have the following setup:

A table called emissions with this model:

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

And a table called emission_messages with this model:

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

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

}

The emission_message table has a field called emission_id for the foreign key.

When I create a new instance of emission I need to create a new instance of emission_message at the same time, that is: in the form where I would insert a new emission in my database I will need to have inputs of the emission_message associated with that same emission. Same goes to the edit form.

I think I did this the wrong way, because I can "manually" insert into the emission_message table with the related id once the emission is created but I'm guessing this is not the right way and that cakePHP is supposed to do this automatically. I don't know how to name my inputs on the form so that the information gets saved properly or if my models are wrong and that's why it doesn't work.

EDIT:

To make things clearer: Emission and EmissionMessage are in a one to one relationship, adding hasOne to Emissions made it work half way, I can now save the fields using:

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

But when I try to update the same record the edit() action it just saves the data in a new row (with the foreign key, but in a new row, instead of updating the previous one)

To save the fields I use:

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

Both in edit() and add() actions (insert and update)

EDIT 2: It seems the hidden input with the id of the EmissionMessage table did the trick (I was not doing it correctly before, once I fixed that, it worked fine) as this answer suggests: saveAll() inserts new row instead of updating

I find it very odd that I need to add that hidden input but at least that solves the problem.

3
From that link I see that I should be using echo $this->Form->input('EmissionMessage.subject1'); but that is not working for me, I also get no error messages, just an empty input - Elaine Marley

3 Answers

1
votes

just do the things in the way like as --

class Emission extends AppModel
{
    var $name = 'Emission';
    var $displayField = 'name';
var $hasOne = array('EmissionMessage' => array
        (
            'className' => 'EmissionMessage',
            'foreignKey' => 'emission_id'
        ));
} 

and make the form after that.

like as --

$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();

and then in the action call-

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

go throuh below link for more detail. http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Models.html

0
votes

If Emission has only one Emission_message, you need to use hasOne Association Type, change your model to:

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

and

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

Declare $hasMany in your Emission for making hasMany relationship with EmissionMessage

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

    public $hasMany = array('EmissionMessage');
}

Emission will also save the records of EmissionMessage model once you put the data array like this. i.e.

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

you can make an above array using your 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();

when you submit the form you can get the data like the above array in $this->request->data.