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

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

Что я имею:

Таблица channel_settings с атрибутами (id, mask_id, provider_id, servicetype_id, channel_id, создан, изменен)

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

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

Теперь мне нужно, чтобы пользователь выбрал тип обслуживания для —Any—, кроме этой записи, будет несколько вставок в базу данных для какого-либо типа обслуживания, потому что для некоторых типов обслуживания нужен другой канал. Количество многократных вставок зависит от того, сколько у провайдера имеет параметр типа обслуживания и канал в таблице 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: зачем я этого хочу? Так что мне не нужно вставлять данные по одному для каждого провайдера. Спасибо

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

Другие решения

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

Что я сделал:
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);
}
0

По вопросам рекламы [email protected]