【问题标题】:CakePHP Save for each checked item of separate modelCakePHP 为单独模型的每个选中项保存
【发布时间】:2011-07-12 05:14:45
【问题描述】:

我在 CakePHP 中保存多个条目时遇到了一些问题。我不确定saveAll() 是否会起作用,因为我正在尝试为从连接表中检查的每个项目保存一个条目,该连接表将两个单独的表连接到保存到的表中。


我有以下表格:SamplesResults 和一个名为 SampleTypeTests 的连接表(连接两个单独的表 - SampleTypes 和测试)。

每个样本都有一个 FK sample_type_id
每个 Result 都有 FK sample_id, sample_type_test_id

我有一个“结果添加”视图,其中列出了 Samples.sample_type_id 的所有 SampleTypeTests

目前我的添加视图表单如下所示:

<?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->end(__('Submit', true)); ?>

储蓄部分是我最头疼的地方。我需要为每个选中的SampleTypeTests 创建一个Results 条目,并将SampleTypeTest.id 添加到FK Results.sample_type_tests_id

我已尝试根据我的需要调整以下内容http://mrphp.com.au/code/working-habtm-form-data-cakephp#habtm_checkbox

这是我得到的:

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
} 

这没有奏效。以上可能是错误的。更多的是展示我的尝试。我迷失在这一切中,我需要一些帮助。我需要使用saveAll吗?我需要嵌套save 吗?我是否让它变得比需要的复杂得多?


更新:

我注意到上面的表单将数组输出为

Array (
[Result] => Array
    (
        [sample_id] => 21
        [sample_type_test_id] => Array
            (
                [0] => 1
                [1] => 24
                [2] => 16
                [3] => 71
            )

    )
)

它应该在什么时候产生:

Array
(
[Result] => Array(
        [0] => Array
            (
                    [sample_id] => 21
                    [sample_type_test_id] => 1
                )
        [1] => Array
            (
                    [sample_id] => 21
                    [sample_type_test_id] => 24
                )
        )
)

那么我可以简单地使用saveAll($this-&gt;data['Result'])

关于如何改进表单以输出所需数组的任何提示?

【问题讨论】:

    标签: cakephp save cakephp-1.3


    【解决方案1】:

    我刚刚对另一篇可能对你有用的帖子给出了类似的答案,我现在没有时间修改它,但如果这不能回答你的问题,请告诉我,然后我会详细说明。

    How to create a view page to save two objects in cakePHP

    好的...在进一步阅读您的问题后,我认为这应该可以解决问题...

    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);
    }
    

    这应该保存到数据库中:

    id | sample_id | sample_type_test_id
    1    21          1
    2    21          24
    3    21          16
    4    21          71
    

    好的,那就试试这个吧……

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

    【讨论】:

    • 谢谢蒂姆。看着另一个答案,我不太清楚如何使它适应这个问题。我基本上已经解决了这个问题,我需要“重新调整”发布的数组。以便它以我可以使用 saveAll() 的方式将其发送到添加操作。知道我们如何调整“或”形式,将某种 foreach 循环放入操作中,以将数组处理为所需的数组。这是蛋糕的方式吗?还是我错过了什么?
    • 我觉得我确实需要使用 saveAll。我可能需要更新我的问题。我想我只需要为它提供正确的数组结构。请参阅book.cakephp.org/view/1031/Saving-Your-Data 的 saveAll
    • 我还注意到您将 saveAll 函数包装在 foreach 循环中,我没有对此进行测试,但 foreach 是否实际上使其成为数组的第二个索引?如果您对积极保存的操作之一是重定向......那不会杀死 foreach 循环吗?
    • 是的,我已经在行动中放弃了 foreach... 问题已更新。希望这没问题。
    • 你能去掉$this->SampleTypeTest->save($data);并将其替换为 pr($data);并将输出粘贴到这里?
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2011-05-17
    相关资源
    最近更新 更多