Обновление указанных строк в CakePHP с использованием массива идентификаторов? - PullRequest
1 голос
/ 29 марта 2012

Этот код обновляет только одну строку (ту, которая соответствует первой в массиве):

Редактировать: показать больше кода!

Вот мой взгляд. Он захватывает записи в БД на основе ассоциации (есть одна модель "клиенты", которая имеет отношение один ко многим с двумя другими моделями, программами и пользователями).

<div class="view">
    <h2><?php echo h($program['Program']['title'])?></h1>
    <?php echo $this->Form->create('User', array('action' => 'pushing')); ?>
    <table id="pushTable">
        <tr><th colspan="5">Select the athletes you would like to push this program to:</th></tr>
        <tr>
        <?php $i=0; ?>
        <?php foreach ($clients['Players'] as $player) {?>
            <?php if ($i == 0) {?><tr><?php } ?>
            <td><?php echo $this->Form->checkbox($player['id']) . ' ' . $player['username'];?></td>
            <?php if ($i == 4) {?></tr><?php $i = 0; } else { $i++; } ?>
        <?php } ?>
        </tr>
    </table>
    <?php echo $this->Form->end(__('Push')); ?>
</div>

В моем контроллере Users:

public function pushing() {
    if ($this->request->is('post') || $this->request->is('put')) {
        $athletes = $this->request->data['User'];
        foreach ( $athletes as $player => $flag){
            if ($flag == 0){
                unset($athletes[$player]);
            }
        }
        $this->User->updateAll(
            array('User.data' => "'foo'"),
            array('User.id' => $athletes)
        );
        $this->Session->setFlash(__('Programs were pushed!'));
        }
    }
}

$ athtes - это массив, собранный из флажков, и мне кажется, с этим проблем нет ... поэтому я не уверен, почему updateAll не выполняет итерацию для каждого идентификатора в массиве ...

Может быть, это не работает по причинам, связанным с БД? Я занимаюсь разработкой MAMP ... возможно, БД не настроен на "атомарные" вещи (об этом слышали только сегодня!).

Ранее я пытался использовать foreach для циклического перебора идентификаторов, затем в foreach просто делал это (edit: больше кода!)

public function pushing() {
    if ($this->request->is('post') || $this->request->is('put')) {
        foreach ($this->request->data['User'] as $player => $flag) {
            if ($flag) {
                $this->User->id = $player; // set ID to player we want to save ($player is id that was suplpied in view to checkbox
                $this->User->saveField('data', 'foo'); // then, push the data!
            }
        }
        $this->Session->setFlash(__('Programs were pushed!'));
    }
    $this->autoRender = false;
    $this->redirect(array('action' => 'index'));                    
}

Но это привело к странным результатам с перенаправлением. Независимо от того, куда я поместил перенаправление в этом действии, сохранение просто хотело делать свое дело. Этот $ this-> autoRender ничего не сделал. Контроллер все еще пытался разрешить / pushing / route

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Дайте этому шанс:)

На ваш взгляд:

<div class="view">
        <h2><?php echo h($program['Program']['title'])?></h1>
        <?php echo $this->Form->create('User', array('action' => 'pushing')); ?>
        <table id="pushTable">
            <tr><th colspan="5">Select the athletes you would like to push this program to:</th></tr>
            <tr>
            <?php $i=0; ?>
            <?php foreach ($clients['Players'] as $player) {?>
                <?php if ($i == 0) {?><tr><?php } ?>
                <td><?php echo $this->Form->input('Player.' . $player['id']. '.id', array('type' => 'checkbox', 'value' => $player['id'])) . ' ' . $player['username'];?></td>
                <?php if ($i == 4) {?></tr><?php $i = 0; } else { $i++; } ?>
            <?php } ?>
            </tr>
        </table>
        <?php echo $this->Form->end(__('Push')); ?>
    </div>

В вашем контроллере:

public function pushing() {
    if ($this->request->is('post') || $this->request->is('put')) {
        $athletes = $this->request->data['Player'];
        $athlete_ids = array();
        foreach($athletes as $a){
            $athlete_ids[$a['id']] = $a['id'];
        }

        $this->User->updateAll(
            array('User.data' => "'foo'"),
            array('User.id' => $athlete_ids)
        );
        $this->Session->setFlash(__('Programs were pushed!'));
        }
    }
}
0 голосов
/ 29 августа 2016

Привет пришлось немного изменить код, чтобы он работал для меня ..

    $contactsids = array();
    foreach($selected as $key => $val){
      if(($val <> '') && ($val <> 0) ) {                  
          $contactsids[$val] = $val;
      }                        
    } 

$this->Contact->updateAll(
  array('Contact.contact_category_id' => $category_id),
  array('Contact.id' => $contactsids)
);   
...