Как сохранить в несколько столов в cakePHP BelongsTo? - PullRequest
0 голосов
/ 13 июля 2011

Форма (newreports.php), когда при отправке необходимо сохранить в таблицу, а также сохранить скрытые данные (27 записей по 7 столбцов в каждой) в таблицу BelongsTo. 7 столбцов: id, user_id, reports_id, count, area, area_id, комментарии. Область должна быть предварительно заполнена как 0-26, а reports_id должен быть одинаковым для всех (100). User_id должен предварительно заполнить форму записи. Кроме того, идентификатор должен заполняться автоматически. Я думаю, что это можно сделать в моем контроллере для функции newreports ().

Нужно ли писать массив таким образом или есть упрощенный способ?

$this->Report->saveAll(
    Array
(
    [Report] => Array
        (
            [0] => Array
                (
                    [id] => //leave blank because it will auto-fill?
            [user_id] => //dynamically from form input
                    [reports_id] => //dynamically from form input
                    [area_id] => //dynamically from form input
                    [area] => 0
    [count] => // this should be blank as there are no counts yet
    [comments] => // this should be blank as there are no comments yet
                )
        [1] => Array
                (
                    [id] => //leave blank because it will auto-fill?
            [user_id] => //dynamically from form input
                    [reports_id] => //dynamically from form input
                    [area_id] => //dynamically from form input
                    [area] => 1
    [count] => // this should be blank as there are no counts yet
    [comments] => // this should be blank as there are no comments yet
                )
        )
) 

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Это то, что сделал для меня

$count = 27;
$v = 0;
  do {
      ######### save report rows to database
      $this->Report->create();
      $this->Report->set(array('reports_id' => $id , 'area' => $v));
              $this->Report->save();
      $v++;
  } while ($v < $count);
0 голосов
/ 22 июля 2011

Если ваш код формы / представления написан правильно, вы сможете уйти с помощью $this->Report->saveAll($this->data['Report']);.

Просмотр исходного кода HTML для вашей формы. Значения атрибутов имени для входных тегов должны быть примерно такими, как data[Report][0][id], data[Report][0][user_id] и т. Д. Вторая запись должна иметь поля, похожие на data[Report][1][id], data[Report][2][user_id] и т. Д.

Когда он получит POST, он автоматически импортирует в правильную структуру массива в $ this-> data.

Если эта форма всегда будет создавать новые записи, то оставьте поля data[Report][][id] (или оставьте их пустыми), и saveAll создаст новые записи.


Обновление для обработки первого комментария.

Непонятно, хотите ли вы присвоить $ data после или до того, как контроллер сохранит все эти скрытые данные. Давайте разберемся с обеими частями; во-первых, сохранить.

Итак, ваш собственный ответ почти правильно подходит для создания данных.

$count = 27;
$v = 0;
$data = array('Report' => array());
do {
    $data['Report'][] = array('reports_id' => $id, 'area' => $v);
  $v++;
} while ($v < $count);

// save report rows to database
$this->Report->saveAll($data['Report']);

Итак, это подготавливает структуру данных, так же, как вы делали в исходном вопросе и в своем ответе. Однако мы используем saveAll () , чтобы создать их все за один раз.

Следующая часть - извлечь сохраненные данные и поместить их в $ this-> data, чтобы вы могли использовать их в форме, которую ваши пользователи увидят после перенаправления, согласно вашему комментарию. Вам нужно что-то подобное в контроллере.

$reports = $this->Report->find('all', array(
    'conditions' => array(
        'reports_id' => $id
    )
));
// merge this in with existing data
$this->data = Set::merge($reports, $this->data);

Предполагается, что $ id находится в URL как часть перенаправления. И именно так вы назначаете эти данные в $ this-> data, чтобы вы могли использовать их в своей форме.

И в вашей форме вы можете ссылаться на несколько полей следующим образом:

$this->Form->create('Report');

foreach ($data['Report'] as $i => $report) {
    $this->Form->input('Report.'.$i.'.id');
    $this->Form->input('Report.'.$i.'.user_id');
    $this->Form->input('Report.'.$i.'.reports_id');
    $this->Form->input('Report.'.$i.'.area_id');
    $this->Form->input('Report.'.$i.'.area');
    $this->Form->input('Report.'.$i.'.count');
    $this->Form->input('Report.'.$i.'.comment');
}

$this->Form->end('Submit);

Вы можете узнать больше о формах для нескольких записей в руководстве CakePHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...