CakePHP Сохранить для каждого отмеченного элемента отдельной модели - PullRequest
2 голосов
/ 09 марта 2011

У меня проблемы с сохранением нескольких записей в CakePHP.Я не уверен, что saveAll() справится с задачей, поскольку я пытаюсь сохранить запись для каждого элемента, проверенного из объединяемой таблицы, которая соединяет две отдельные таблицы с той, в которую сохраняется.У меня есть следующие таблицы: Samples, Results и таблица соединений с именем SampleTypeTests (объединяет две отдельные таблицы - SampleTypes & Tests).

Каждый образец имеет FK sample_type_id
Каждый результат имеет FK sample_id, sample_type_test_id

У меня есть представление Добавить для результатов, в котором перечислены все SampleTypeTests дляSamples.sample_type_id

Моя форма просмотра Add в данный момент выглядит следующим образом:

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

Спасительная часть - это то, где у меня самая большая головная боль.Мне нужна запись Results, созданная для каждой проверенной SampleTypeTests, и добавление 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->data['Result'])

Любые советы о том, как улучшить форму для вывода нужного массива?

1 Ответ

1 голос
/ 10 марта 2011

Я только что дал аналогичный ответ на другой пост, который может быть полезен для вас, у меня нет времени, чтобы изменить его прямо сейчас, но дайте мне знать, если это не ответит на ваш вопрос, тогда я уточню.*

Как создать страницу просмотра для сохранения двух объектов в 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);
...