I'm having some trouble saving multiple entries in CakePHP. I'm not sure whether saveAll()
will do the trick as I'm trying to save an entry for each item checked from a join table which joins two separate tables to the one being saved to.
I have the following tables:
Samples
, Results
and a join table called SampleTypeTests
(joins two separate tables - SampleTypes & Tests).
Each Sample has an FK sample_type_id
sample_id
, sample_type_test_id
I have an Add view for Results which lists all SampleTypeTests
for a Samples.sample_type_id
My Add view form looks like this at the moment:
<?php
echo $this->Form->create('Result');
echo '<fieldset>';
echo '<legend>Choose Analysis</legend>';
echo $this->Form->input('sample_id', array('type'=>'hidden', 'value' => $this->passedArgs['0']));
echo $this->Form->input('sample_type_test_id',array(
'label' => __('Tests',true),
'type' => 'select',
'multiple' => 'checkbox',
'options' => $sampleTypeTests,
'selected' => $html->value('Result.sample_type_test_id'),
'hiddenField' => false
));
echo '</fieldset>';
echo $this->Form->开发者_C百科end(__('Submit', true)); ?>
The saving part is where I'm having the biggest headache. I need a Results
entry created for each SampleTypeTests
checked and that SampleTypeTest.id
to be added to the FK Results.sample_type_tests_id
.
I have tried to adapt the following to my needs http://mrphp.com.au/code/working-habtm-form-data-cakephp#habtm_checkbox
Here is what I got:
function add() {
if ($this->Result->saveAll($this->data['Result'])) {
$this->Session->setFlash(__('All required tests have been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('Could not be saved. Please, try again.', true));
}
// Everything else
}
This hasn't worked. The above may be wrong. It is more to demonstrate what I've attempted. I'm getting very lost in it all and I need some help. Do I need to use saveAll
? Do I need to nest the save
? Have I made it far more complicated than it needs to be?
UPDATE:
I have noticed the above form outputs the array as
Array (
[Result] => Array
(
[sample_id] => 21
[sample_type_test_id] => Array
(
[0] => 1
[1] => 24
[2] => 16
[3] => 71
)
)
)
When what it should produce is:
Array
(
[Result] => Array(
[0] => Array
(
[sample_id] => 21
[sample_type_test_id] => 1
)
[1] => Array
(
[sample_id] => 21
[sample_type_test_id] => 24
)
)
)
Then I can simply use saveAll($this->data['Result'])
Any hints on how I can improve the form to output the desired array?
I just gave a similar answer to another post that might be useful to you, I don't have time to modify it right now, but let me know if this doesn't answer your question then I will elaborate.
How to create a view page to save two objects in cakePHP
ok... after reading your problem further, I think this should do the trick...
foreach ($this->data['Result']['sample_type_test_id'] as $v) {
$data = array(
'id'=>'',
'sample_id' => $this->data['Result']['sample_id'],
'sample_type_test_id' => $v
);
$this->SampleTypeTest->save($data);
}
This should save to the db as :
id | sample_id | sample_type_test_id
1 21 1
2 21 24
3 21 16
4 21 71
Ok try this then...
$data;
$i=0;
foreach ($this->data['Result']['sample_type_test_id'] as $v) {
$data[$i] = array(
'id'=>'',
'sample_id' => $this->data['Result']['sample_id'],
'sample_type_test_id' => $v
);
$i++;
}
$this->Result->save($data);
精彩评论