множественная вставка в 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
и ваш исходный код исправления и сохранения будет работать нормально для создания всей структуры записи.