Yii似乎忽略了PrimaryKey的AUTO_INCREMENT

时间:2017-10-27 20:06:25

标签: yii2-advanced-app

我们数据库的所有表(大约120个)中的主键都设置为AUTO_INCREMENT。

我注意到,yii2似乎忽略了这个指导方针。 如果我用来创建一个新记录(当然没有在公式中填写PrimaryKey),新记录将有一个id,这实际上完全没有根据。 例如,我在表中有两条记录,它们是使用phpmyadmin通过id = 1 / id = 2创建的。 使用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);
          } */
    }

使用gii of mootensai生成模型。如果我应该粘贴它,请告诉我!

也许,这种行为是'由使用mouensai的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',
            ],
        ];
    }

我得到了解决方案: 我不得不在两个模型中移除UUID类mootensai !!

1 个答案:

答案 0 :(得分:1)

我不得不在方法行为中使用UUID类删除。

mootensai的扩展名不能与主键设置为AUTO_INCREMENT结合使用。