множественная вставка в cakephp 3.8

Я должен сделать несколько списков. где два поля имеют общие значения. Например, если я введу Интер, Милан, Юв, у них будут общие поля nationality_season и series_season. Кроме того, пользователь должен выбрать количество размещаемых рекламных объявлений.

только когда я иду, чтобы вставить все: Ошибка: SQLSTATE[HY000]: Общая ошибка: 1364 Поле club_id не имеет значения по умолчанию

у меня есть эта база данных

DROP TABLE IF EXISTS `championships`;
CREATE TABLE IF NOT EXISTS `championships` (
  `id` int(11),
  `club_id` int(11) NOT NULL,
  `season` varchar(9) NOT NULL DEFAULT ' ',
  `nationality_championship` varchar(50) NOT NULL DEFAULT '0',
  `championship_series` varchar(50) NOT NULL DEFAULT '0',
  `penal` int(11) DEFAULT '0',
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `clubs`;
CREATE TABLE IF NOT EXISTS `clubs` (
  `id` int(11),
  `name` varchar(35) NOT NULL DEFAULT ' '
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

ALTER TABLE clubs
ADD PRIMARY KEY (id),
MODIFY id int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE championships
ADD PRIMARY KEY (id),
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
ADD FOREIGN KEY(club_id) REFERENCES clubs(id);

функция, которая управляет вставкой, - это функция добавления в контроллере чемпионатов:

 public function add()
    {

        $championship =$this->Championships->newEntity();
        if ($this->request->is('post')) {
            $championship =$this->Championships->patchEntity($championship, $this->request->getData());
            if ($this->Championships->save($championship)) {
                $this->Flash->success(__('The championship has been saved.'));

                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The championship could not be saved. Please, try again.'));
        }

        $clubsUnmated=$this->Championships->Clubs->find('list',['keyField' => 'id',
        'valueField' =>['nome_societa']])->notMatching('Championships');

        $this->set(compact('championship', 'clubsUnmated'));
    }

извлечь код add.ctp:

<div class="championships form large-9 medium-8 columns content">
    <?=$this->Form->create($championship) ?>
    <fieldset>
        <legend><?= __('Add Championship') ?></legend>
        <?php

            echo $this->Form->control('season',['class'=>'form-control']);
            echo $this->Form->control('nazionalità_campionato',['class'=>'form-control']);
            echo $this->Form->control('serie_campionato',['class'=>'form-control']);
            echo $this->Form->control('club_id', ['options' => $clubsUnmated,'data-role'=>'tagsinput','type'=>'text','placeholder'=>'aggiungi squadre','class'=>'form-control']);

        ?>
    </fieldset>
    <?=$this->Form->button(__('Submit')) ?>
    <?=$this->Form->end() ?>
</div>

1 ответ

Во-первых, ваши элементы управления формой имеют разные имена полей, чем показывает ваша схема базы данных для nationality_championship а также championship_series. Это не вызывает этой проблемы, но скоро возникнет проблема.

Главное здесь то, что похоже, что вы собираетесь получить массив значений из своего club_id, но поле в базе данных - это одно значение. Если вы хотите придерживаться этой схемы базы данных, вам придется перебирать этот массив (который, вероятно, следует называть как-то еще в вашей форме, чтобы избежать проблем при создании ваших сущностей для сохранения). Например, если вы переименуете этот элемент управления вclubs, тогда это может выглядеть примерно так:

if ($this->request->is('post')) {
    $championships = [];
    $data = $this->request->getData();
    foreach ($data['clubs'] as $club_id) {
        $championships[] = $this->Championships->newEntity(array_merge($data, compact('club_id')));
    }
    if ($this->Championships->saveMany($championships)) {
        $this->Flash->success(__('The championship has been saved.'));
        return $this->redirect(['action' => 'index']);
    }
    $this->Flash->error(__('The championship could not be saved. Please, try again.'));
}

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

Другие вопросы по тегам