Обновление до значения в _joinData работает, но отсутствует правильный индекс - PullRequest
0 голосов
/ 27 августа 2018

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

Вот как у меня есть контроллер:

public function edit($id)
{

    $brigada = $this->Brigadas
        ->findById($id)
        ->contain(['Tags', 'Voluntarios'])
        ->firstOrFail();

    if ($this->request->is(['patch', 'post', 'put'])) {
        // https://github.com/cakephp/cakephp/issues/7864
        if (!empty($this->request->data['voluntarios']['_ids'])) {
            $vol = [];
            $ids = [];
            foreach ($this->request->data['voluntarios']['_ids'] as $key=>$locationId) {

                $vol['_ids'][$key] = $locationId;

                $vol[] = [
                    '_joinData' => [
                        'lider' => isset($this->request->data['voluntarios'][$key]['_joinData']['lider']) ? $this->request->data['voluntarios'][$key]['_joinData']['lider'] : false
                    ]
                ];


            }
        }

        if (isset($vol)){                
            $this->request->data['voluntarios'] = $vol;
        }

        $this->Brigadas->patchEntity($brigada, $this->request->data, ['associated' => ['Voluntarios._joinData', 'Participaciones', 'Participaciones._joinData']]);

        if ($this->Brigadas->save($brigada)) {
            $this->Flash->success(__('Your team data has been updated.'));
            return $this->redirect(['action' => 'view', $id]);
        }
        $this->Flash->error(__('Unable to update your team data.'));
    }
}

Вот так я итерировал свою форму. Заметил, что я добавил дополнительную скрытую форму для идентификатора, чтобы попробовать изменить номера идентификаторов Но результат точно такой же, в конце концов.

    foreach($all_vol as $key=>$voluntario){
        echo $this->Form->control('voluntarios.'.$key.'.id', ['hidden' => true]);
        echo $this->Form->control('voluntarios.'.$key.'._joinData.lider', [
            'label' => $voluntario->full_name,
            'default'=>'0',
        ]);
    }

Вот запрос, отправленный с помощью формы.

[
    '_ids' => [
        (int) 0 => '1',
        (int) 1 => '2',
        (int) 2 => '184',
        (int) 3 => '303',
        (int) 4 => '1838',
        (int) 5 => '1873',
        (int) 6 => '2553',
        (int) 7 => '4467',
        (int) 8 => '4973',
        (int) 9 => '5148',
        (int) 10 => '5493',
        (int) 11 => '6307',
        (int) 12 => '7055',
        (int) 13 => '7467',
        (int) 14 => '7561',
        (int) 15 => '7567',
        (int) 16 => '7864'
    ],
    (int) 0 => [
        'id' => '184',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 1 => [
        'id' => '303',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 2 => [
        'id' => '1838',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 3 => [
        'id' => '1873',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 4 => [
        'id' => '2553',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 5 => [
        'id' => '4467',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 6 => [
        'id' => '4973',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 7 => [
        'id' => '5148',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 8 => [
        'id' => '5493',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 9 => [
        'id' => '6307',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 10 => [
        'id' => '7055',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 11 => [
        'id' => '7467',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 12 => [
        'id' => '7561',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 13 => [
        'id' => '7567',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 14 => [
        'id' => '7864',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 15 => [
        'id' => '1',
        '_joinData' => [
            'lider' => '1'
        ]
    ],
    (int) 16 => [
        'id' => '2',
        '_joinData' => [
            'lider' => '1'
        ]
    ]
]

Я добавил элементы с id 1 и 2 внизу и превратил их в «lider», но когда они передаются в patchEntity, два разных элемента выбираются как «lider». Вот запрос после редактирования вручную.

[
    (int) 0 => [
        'id' => '1',
        '_joinData' => [
            'lider' => '1'
        ]
    ],
    (int) 1 => [
        'id' => '2',
        '_joinData' => [
            'lider' => '1'
        ]
    ],
    (int) 2 => [
        'id' => '184',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 3 => [
        'id' => '303',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 4 => [
        'id' => '1838',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 5 => [
        'id' => '1873',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 6 => [
        'id' => '2553',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 7 => [
        'id' => '4467',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 8 => [
        'id' => '4973',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 9 => [
        'id' => '5148',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 10 => [
        'id' => '5493',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 11 => [
        'id' => '6307',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 12 => [
        'id' => '7055',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 13 => [
        'id' => '7467',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 14 => [
        'id' => '7561',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 15 => [
        'id' => '7567',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    (int) 16 => [
        'id' => '7864',
        '_joinData' => [
            'lider' => '0'
        ]
    ],
    '_ids' => [
        (int) 0 => '1',
        (int) 1 => '2',
        (int) 2 => '184',
        (int) 3 => '303',
        (int) 4 => '1838',
        (int) 5 => '1873',
        (int) 6 => '2553',
        (int) 7 => '4467',
        (int) 8 => '4973',
        (int) 9 => '5148',
        (int) 10 => '5493',
        (int) 11 => '6307',
        (int) 12 => '7055',
        (int) 13 => '7467',
        (int) 14 => '7561',
        (int) 15 => '7567',
        (int) 16 => '7864'
    ]
]

В конце концов, не имеет значения, редактирую ли я вручную или нет, так как я получаю это по моему вызову patchEntity. Обратите внимание, что «id» не является ни 1, ни 2:

    '_joinData' => object(App\Model\Entity\Participacione) {
        'id' => (int) 981,
        'brigada_id' => (int) 222,
        'voluntario_id' => (int) 7567,
        'lider' => true,
        '[new]' => false,
        '[accessible]' => [
            'brigada_id' => true,
            'voluntario_id' => true,
            'lider' => true,
            'brigada' => true,
            'voluntario' => true

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

1 Ответ

0 голосов
/ 28 августа 2018

Удивительно, но мне удалось решить эту проблему с помощью атрибута сортировки в моей таблице. Как это:

$this->belongsToMany('Voluntarios', [
        'foreignKey' => 'brigada_id',
        'targetForeignKey' => 'voluntario_id',
        'joinTable' => 'participaciones',
        'saveStrategy' => 'replace',
        'through' => 'Participaciones',
        'sort' => ['Voluntarios.id' => 'ASC'],
    ]);

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

...