Yii 似乎忽略了 PrimaryKey 的 AUTO_INCREMENT
Yii seems to neglect AUTO_INCREMENT for PrimaryKey
我们数据库的所有 table 个(大约 120 个)中的主键都设置为 AUTO_INCREMENT。
我注意到,yii2 似乎忽略了这条准则。
如果我使用新建一条记录(当然没有在formula中填写PrimaryKey),新记录会有一个id,这实际上是完全没有根据的。
例如,我在 table 中有两条记录,它们是通过 id=1/id=2 使用 phpmyadmin 创建的。
使用 yii 创建的新记录的 ID 为 4191。
此外,我有时会出错:
Duplicate entry for Primary Key
任何想法,如何解决这个问题?
这是公式。 id (Primay Key) 无处填写,因为这个值应该在后台保存到数据库中!
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\date\DatePicker;
use \common\modules\basis\models\Person;
use common\modules\lookup\models\LPersonArt;
use kartik\widgets\FileInput;
$id_person_art_bewerber = Person::find()->where(['id_person_art' => 1])->one()->id_person_art;
$id_person_art_mitarbeiter = Person::find()->where(['id_person_art' => 3])->one()->id_person_art;
$form = ActiveForm::begin([
'id' => 'bewerber-view',
'options' => [
'class' => 'form-horizontal']
]);
?>
<?= $form->errorSummary($model); ?>
<!-- START ACCORDION & CAROUSEL-->
<div class="row">
<div class="col-md-6">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">Bitte hier zu-und aufklappen </h3>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="box-group" id="accordion">
<!-- we are adding the .panel class so bootstrap.js collapse plugin detects it -->
<div class="panel box box-primary">
<div class="box-header with-border">
<h4 class="box-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
Inputfelder der Personentabelle
</a>
</h4>
</div>
<div id="collapseOne" class="panel-collapse collapse in">
<div class="box-body">
<div class="bewerber-view">
<?=
$form->field($model_person, 'angelegt_am')->widget(\kartik\datecontrol\DateControl::classname(), [
'type' => \kartik\datecontrol\DateControl::FORMAT_DATETIME,
'disabled' => true,
]);
?>
.
.
.
<!-- END ACCORDION & CAROUSEL-->
<?=
$form->field($model, 'id_person')->widget(\kartik\widgets\Select2::classname(), [
'data' => Person::getPerson($id_person_art_bewerber),
'options' => ['placeholder' => Yii::t('app', 'Bitte geben sie den Nachnamen des Bewerbers über die DropDownbox ein')],
'pluginOptions' => [
'allowClear' => true,
],
]);
?>
.
.
.
这是控制器:
public function actionCreate() {
//try {
$model = new Bewerber(['scenario' => Bewerber::SCENARIO_CREATE]);
$model_person = new Person(['scenario' => Person::SCENARIO_CREATE]);
$behavior = new \common\wsl_components\Wsl_Blameable_Behavior();
$angelegt_von = $behavior->get_User_Person_Id();
if (!$model || !$model_person) {
throw new NotFoundHttpException("Bitte überprüfen Sie die Validität der Tabellen bewerber bzw. person");
}
$model->angelegt_von = $angelegt_von;
$model_person->angelegt_von = $angelegt_von;
if ($model->load(Yii::$app->request->post()) && $model_person->load(Yii::$app->request->post())) {
$valid = $model->validate();
$isValid = $model_person->validate();
$isValid = $valid & $isValid;
if ($isValid) {
$model->avatar = UploadedFile::getInstances($model, 'avatar');
$model->upload();
$model_person->save();
$model->save();
return $this->redirect(['view', 'id' => $model->id]);
} else {
$error_person = $model_person->getErrors();
$error_bewerber = $model->getErrors();
foreach ($error_person as $values) {
foreach ($values as $ausgabe) {
echo"<p>" . $ausgabe . "</p>";
}
}
foreach ($error_bewerber as $values) {
foreach ($values as $ausgabe) {
echo"<p>" . $ausgabe . "</p>";
}
}
echo Growl::widget([
'type' => Growl::TYPE_DANGER,
'title' => 'Oh snap!',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Aus unbekannten Gründen konnten die Tabellen nicht validiert werden<br>Bitte informieren Sie den Hersteller gemäß obiger Angaben!',
'showSeparator' => true,
'delay' => 2000,
'pluginOptions' => [
'showProgressbar' => true,
'placement' => [
'from' => 'top',
'align' => 'center',
]
]
]);
return $this->render('create', [
'model' => $model,
'model_person' => $model_person,
]);
}
} else {
return $this->render('create', [
'model' => $model,
'model_person' => $model_person,
]);
}
/* } catch (\Exception $error) {
$go_back = "bewerber";
\common\wsl_components\error_handling::error($error, $go_back);
} */
}
已使用 mootensai 的 gii 生成模型。如果我要粘贴,请告诉我!
也许,此行为是“使用 mootensai 的 uuid 行为的模型引起的?”如果我删除这个行为,我会得到这样的错误
SQLSTATE[22003]: Numeric value out of range: 167 Out of range value for column 'id' at row 1
The SQL being executed was: INSERT INTO `bewerber` (`angelegt_von`, `id_person`, `id_person_rekrutiert_von`, `id_abrechnungsweg`, `id_kanal`, `id_bewerberquelle`, `id_ba_xml_gelernter_beruf_1`, `id_ba_xml_gelernter_beruf_2`, `id_ba_xml_gelernter_beruf_3`, `umkreis`, `arbeitsuchend_seit`, `avgs`, `arbeitsumfang_vollzeit`, `avgs_betrag`, `ablaufdatum_avgs`, `wunschgehalt_brutto`, `beurteilung_fachlich`, `beurteilung_persoenlich`, `sonstiges`, `verfuegbar_ab`, `gesuchte_positionen`, `anschreiben`, `arbeitsumfang_teilzeit`, `arbeitszeit_bueroueblich`, `arbeitszeit_vormittag`, `arbeitszeit_nachmittag`, `arbeitszeit_abend`, `arbeitszeit_nacht`, `arbeitszeit_wochenende`, `schichtbereitschaft`, `wochenstunden_minimum`, `wochenstunden_maximum`, `bemerkung_intern`, `quereinsteiger`, `zeitarbeit`, `pkw`, `fuehrerschein_pkw`, `fuehrerschein_lkw`, `fuehrerschein_omnibus`, `reisebereitschaft`, `kandidat`, `kandidat_seit`, `veroeffentlichen_bewerberboerse`, `kontakt_halten`, `aktiv`, `zuletzt_deaktiviert_am`, `angelegt_am`, `optimistic_lock`, `aktualisiert_am`) VALUES (5, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 10, NULL, 1, 1, 2000, NULL, 750, '', '', '', NULL, '', '', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 10, 30, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 1, 1, 1, NULL, NOW(), 0, NOW())
Error Info: Array( [0] => 22003 [1] => 167 [2] => Out of range value for column 'id' at row 1
这是模型中 mootensai 的 UUID 行为:
public function behaviors() {
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'angelegt_am',
'updatedAtAttribute' => 'aktualisiert_am',
'value' => new \yii\db\Expression('NOW()'),
],
'uuid' => [
'class' => UUIDBehavior::className(),
'column' => 'id',
],
];
}
我得到了解决方案:
我必须删除两个模型中 mootensai 的 UUID class!!
我不得不在方法行为中删除使用 UUID class。
mootensai 的这个扩展无法与设置为 AUTO_INCREMENT 的主键组合。
我们数据库的所有 table 个(大约 120 个)中的主键都设置为 AUTO_INCREMENT。
我注意到,yii2 似乎忽略了这条准则。 如果我使用新建一条记录(当然没有在formula中填写PrimaryKey),新记录会有一个id,这实际上是完全没有根据的。 例如,我在 table 中有两条记录,它们是通过 id=1/id=2 使用 phpmyadmin 创建的。 使用 yii 创建的新记录的 ID 为 4191。 此外,我有时会出错:
Duplicate entry for Primary Key
任何想法,如何解决这个问题?
这是公式。 id (Primay Key) 无处填写,因为这个值应该在后台保存到数据库中!
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\date\DatePicker;
use \common\modules\basis\models\Person;
use common\modules\lookup\models\LPersonArt;
use kartik\widgets\FileInput;
$id_person_art_bewerber = Person::find()->where(['id_person_art' => 1])->one()->id_person_art;
$id_person_art_mitarbeiter = Person::find()->where(['id_person_art' => 3])->one()->id_person_art;
$form = ActiveForm::begin([
'id' => 'bewerber-view',
'options' => [
'class' => 'form-horizontal']
]);
?>
<?= $form->errorSummary($model); ?>
<!-- START ACCORDION & CAROUSEL-->
<div class="row">
<div class="col-md-6">
<div class="box box-solid">
<div class="box-header with-border">
<h3 class="box-title">Bitte hier zu-und aufklappen </h3>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="box-group" id="accordion">
<!-- we are adding the .panel class so bootstrap.js collapse plugin detects it -->
<div class="panel box box-primary">
<div class="box-header with-border">
<h4 class="box-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne">
Inputfelder der Personentabelle
</a>
</h4>
</div>
<div id="collapseOne" class="panel-collapse collapse in">
<div class="box-body">
<div class="bewerber-view">
<?=
$form->field($model_person, 'angelegt_am')->widget(\kartik\datecontrol\DateControl::classname(), [
'type' => \kartik\datecontrol\DateControl::FORMAT_DATETIME,
'disabled' => true,
]);
?>
.
.
.
<!-- END ACCORDION & CAROUSEL-->
<?=
$form->field($model, 'id_person')->widget(\kartik\widgets\Select2::classname(), [
'data' => Person::getPerson($id_person_art_bewerber),
'options' => ['placeholder' => Yii::t('app', 'Bitte geben sie den Nachnamen des Bewerbers über die DropDownbox ein')],
'pluginOptions' => [
'allowClear' => true,
],
]);
?>
.
.
.
这是控制器:
public function actionCreate() {
//try {
$model = new Bewerber(['scenario' => Bewerber::SCENARIO_CREATE]);
$model_person = new Person(['scenario' => Person::SCENARIO_CREATE]);
$behavior = new \common\wsl_components\Wsl_Blameable_Behavior();
$angelegt_von = $behavior->get_User_Person_Id();
if (!$model || !$model_person) {
throw new NotFoundHttpException("Bitte überprüfen Sie die Validität der Tabellen bewerber bzw. person");
}
$model->angelegt_von = $angelegt_von;
$model_person->angelegt_von = $angelegt_von;
if ($model->load(Yii::$app->request->post()) && $model_person->load(Yii::$app->request->post())) {
$valid = $model->validate();
$isValid = $model_person->validate();
$isValid = $valid & $isValid;
if ($isValid) {
$model->avatar = UploadedFile::getInstances($model, 'avatar');
$model->upload();
$model_person->save();
$model->save();
return $this->redirect(['view', 'id' => $model->id]);
} else {
$error_person = $model_person->getErrors();
$error_bewerber = $model->getErrors();
foreach ($error_person as $values) {
foreach ($values as $ausgabe) {
echo"<p>" . $ausgabe . "</p>";
}
}
foreach ($error_bewerber as $values) {
foreach ($values as $ausgabe) {
echo"<p>" . $ausgabe . "</p>";
}
}
echo Growl::widget([
'type' => Growl::TYPE_DANGER,
'title' => 'Oh snap!',
'icon' => 'glyphicon glyphicon-remove-sign',
'body' => 'Aus unbekannten Gründen konnten die Tabellen nicht validiert werden<br>Bitte informieren Sie den Hersteller gemäß obiger Angaben!',
'showSeparator' => true,
'delay' => 2000,
'pluginOptions' => [
'showProgressbar' => true,
'placement' => [
'from' => 'top',
'align' => 'center',
]
]
]);
return $this->render('create', [
'model' => $model,
'model_person' => $model_person,
]);
}
} else {
return $this->render('create', [
'model' => $model,
'model_person' => $model_person,
]);
}
/* } catch (\Exception $error) {
$go_back = "bewerber";
\common\wsl_components\error_handling::error($error, $go_back);
} */
}
已使用 mootensai 的 gii 生成模型。如果我要粘贴,请告诉我!
也许,此行为是“使用 mootensai 的 uuid 行为的模型引起的?”如果我删除这个行为,我会得到这样的错误
SQLSTATE[22003]: Numeric value out of range: 167 Out of range value for column 'id' at row 1
The SQL being executed was: INSERT INTO `bewerber` (`angelegt_von`, `id_person`, `id_person_rekrutiert_von`, `id_abrechnungsweg`, `id_kanal`, `id_bewerberquelle`, `id_ba_xml_gelernter_beruf_1`, `id_ba_xml_gelernter_beruf_2`, `id_ba_xml_gelernter_beruf_3`, `umkreis`, `arbeitsuchend_seit`, `avgs`, `arbeitsumfang_vollzeit`, `avgs_betrag`, `ablaufdatum_avgs`, `wunschgehalt_brutto`, `beurteilung_fachlich`, `beurteilung_persoenlich`, `sonstiges`, `verfuegbar_ab`, `gesuchte_positionen`, `anschreiben`, `arbeitsumfang_teilzeit`, `arbeitszeit_bueroueblich`, `arbeitszeit_vormittag`, `arbeitszeit_nachmittag`, `arbeitszeit_abend`, `arbeitszeit_nacht`, `arbeitszeit_wochenende`, `schichtbereitschaft`, `wochenstunden_minimum`, `wochenstunden_maximum`, `bemerkung_intern`, `quereinsteiger`, `zeitarbeit`, `pkw`, `fuehrerschein_pkw`, `fuehrerschein_lkw`, `fuehrerschein_omnibus`, `reisebereitschaft`, `kandidat`, `kandidat_seit`, `veroeffentlichen_bewerberboerse`, `kontakt_halten`, `aktiv`, `zuletzt_deaktiviert_am`, `angelegt_am`, `optimistic_lock`, `aktualisiert_am`) VALUES (5, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 10, NULL, 1, 1, 2000, NULL, 750, '', '', '', NULL, '', '', NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 10, 30, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, 1, 1, 1, NULL, NOW(), 0, NOW())
Error Info: Array( [0] => 22003 [1] => 167 [2] => Out of range value for column 'id' at row 1
这是模型中 mootensai 的 UUID 行为:
public function behaviors() {
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'angelegt_am',
'updatedAtAttribute' => 'aktualisiert_am',
'value' => new \yii\db\Expression('NOW()'),
],
'uuid' => [
'class' => UUIDBehavior::className(),
'column' => 'id',
],
];
}
我得到了解决方案: 我必须删除两个模型中 mootensai 的 UUID class!!
我不得不在方法行为中删除使用 UUID class。
mootensai 的这个扩展无法与设置为 AUTO_INCREMENT 的主键组合。