Сохранение нескольких записей на основе пользовательского ввода в Cakephp

Что я использую: cakephp версии 2.4.1.

Что у меня есть:

таблица channel_settings с атрибутами (id, mask_id, provider_id, servicetype_id, channel_id, created, modified)

таблица channel_alert_defaults с атрибутами (id, provider_id, servicetype_id, channel_id)

На странице добавления нового channel_setting пользователь может вставить каждого провайдера в каждый тип сервиса своего канала.

Теперь мне нужно, чтобы когда пользователь выбирал тип обслуживания для - Любой - тогда, помимо этой одной записи, будет несколько множественных вставок в базу данных для некоторого типа обслуживания, потому что для некоторого типа обслуживания нужен другой канал. Количество множественных вставок зависит от того, сколько провайдеров имеет параметр типа обслуживания и канал в таблице channel_alert_defaults

Вот существующая система:  существующее состояние

Что мне сейчас нужно:  введите описание изображения здесь

Вот что я пытаюсь, но до сих пор не понимаю, что такое код множественной вставки.

    public function add() {
    if ($this->request->is('post')) {
        Controller::loadModel('Servicetype');
        $this->Servicetype->recursive = -1; 
        $servicetype = $this->Servicetype->find('all');
        $this->request->data['ChannelSetting']['mask_id'] = $this->Session->read('current_mask_id');
                    $maskid = $this->request->data['ChannelSetting']['mask_id'];
                    $providerid = $this->request->data['ChannelSetting']['provider_id'];
                    $servicetypeid = $this->request->data['ChannelSetting']['servicetype_id'];

        $this->ChannelSetting->create();

                    if ($this->request->data['ChannelSetting']['servicetype_id'] == 0) {

                        Controller::loadModel('ChannelAlertDefaults');
                        $this->ChannelAlertDefault->recursive = -1; 
                        $channelalertdefault = $this->ChannelAlertDefaults->findByProviderId($providerid);
                        // loop insert goes here, I think...

                        if ($this->ChannelSetting->save($this->request->data)) {
                                $this->Session->setFlash(__('The channel setting has been saved'), 'success');
                                return $this->redirect(array('action' => 'add'));
                        }
                        else {
                                $this->Session->setFlash(__('The channel setting failed to save'));
                        }

                    } else {
                        if ($this->ChannelSetting->save($this->request->data)) {
                                $this->Session->setFlash(__('The channel setting has been saved'), 'success');
                                return $this->redirect(array('action' => 'add'));
                        }
                        else {
                                $this->Session->setFlash(__('The channel setting failed to save'));
                        }
                    }

                        if ($this->ChannelSetting->save($this->request->data)) {
                                $this->Session->setFlash(__('The channel setting has been saved'), 'success');
                                return $this->redirect(array('action' => 'add'));
                        }
                        else {
                                $this->Session->setFlash(__('The channel setting failed to save'));
                        }
    }

}

PS: зачем мне это? Так что мне не нужно вставлять данные по одному для каждого провайдера. Спасибо


person Angelina    schedule 12.08.2015    source источник


Ответы (2)


Я не могу сейчас протестировать, но, возможно, вы можете попробовать что-то вроде этого:

$data = array(
                [0] => array(
                        'MASK' => $this->request->data['ChannelSetting']['mask_id'],
                        'PROVIDER' => $this->request->data['ChannelSetting']['provider_id'],
                        'SERVICE_TYPE' => *all*
                ),
                [1] => array(
                        'MASK' => $this->request->data['ChannelSetting']['mask_id'],
                        'PROVIDER' => $this->request->data['ChannelSetting']['provider_id'],
                        'SERVICE_TYPE' => *otp*
                ),
                [2] => array(
                        'MASK' => $this->request->data['ChannelSetting']['mask_id'],
                        'PROVIDER' => $this->request->data['ChannelSetting']['provider_id'],
                        'SERVICE_TYPE' => *httpalert*
                )
        );

        $this->ChannelSetting->saveAll($data, array('deep' => true));
person Javi    schedule 12.08.2015

@Javi, спасибо, что вдохновили меня на решение проблемы.

Что я сделал: 1. Подсчитайте, сколько данных из таблицы channel_alert_defaults, чем соответствует provider_id из пользовательского ввода 2. Сделайте вставку цикла в таблицу channel_setting, используя saveAll

Вот мой код:

Controller::loadModel('ChannelAlertDefault');
                        $this->ChannelAlertDefault->recursive = 1;  
                        $channelalertdefault = $this->ChannelAlertDefault->findAllByProviderId($providerid);
                        $amount = count($channelalertdefault); // to count how many array
                        // Here is the loop...                           
                        if ($this->ChannelSetting->save($this->request->data)) {
                            for($i=0;$i<$amount;$i++) {
                                $this->request->data['ChannelSetting']['mask_id'] = $this->Session->read('current_mask_id');
                                $this->request->data['ChannelSetting']['provider_id'] = $channelalertdefault[$i]['ChannelAlertDefault']['provider_id'];
                                $this->request->data['ChannelSetting']['servicetype_id'] = $channelalertdefault[$i]['ChannelAlertDefault']['servicetype_id'];
                                $this->request->data['ChannelSetting']['channel_id'] = $channelalertdefault[$i]['ChannelAlertDefault']['channel_id'];
                                $this->ChannelSetting->saveAll($this->request->data);
                            }
person Angelina    schedule 13.08.2015
comment
Цикл не нужен для одновременного сохранения нескольких строк в одну и ту же модель. Просто используйте saveAll один раз или цикл с сохранением :) - person Javi; 13.08.2015