wake-up-neo.com

Laravel 5.1 Es wurde eine unbekannte Datenbanktypenzahl angefordert

Beim Ausführen von php handwerker migrate wurde der folgende Fehler angezeigt

[Lehre\DBAL\DBALException]
Es wurde eine unbekannte Datenbanktypenzahl angefordert. Doctrine\DBAL\Platforms\MySqlPlatform unterstützt sie möglicherweise nicht. 

So lösen Sie dieses Problem.

Code:

public function up() {
    Schema::table('blogs', function (Blueprint $table) {
        $table->string('wordpress_id')->nullable();
        $table->string('google_blog_id')->nullable()->change();
    });
}
27
karthick

Die offizielle Laravel 5.1 Dokumentation heißt:

Hinweis: Das Umbenennen von Spalten in einer Tabelle mit einer Aufzählungsspalte wird derzeit nicht unterstützt.

Es ist egal, ob Sie versuchen, eine andere Spalte zu ändern. Wenn die Tabelle eine enumirgendwo enthält, funktioniert sie nicht. Es ist ein Doktrin-DBAL-Problem.

Als Problemumgehung können Sie entweder die Spalte löschen und eine neue hinzufügen (Spaltendaten gehen verloren):

public function up()
{
    Schema::table('users', function(Blueprint $table)
    {
        $table->dropColumn('name');
    });

    Schema::table('users', function(Blueprint $table)
    {
        $table->text('username');
    });
}

oder verwenden Sie eine DB-Anweisung:

public function up()
{
    DB::statement('ALTER TABLE projects CHANGE slug url VARCHAR(200)');
}

public function down()
{
    DB::statement('ALTER TABLE projects CHANGE url slug VARCHAR(200)');
}

Quelle: https://github.com/laravel/framework/issues/1186

49
Adrenaxus

Es ist ein bekanntes Problem, wie in Laravel 5.1 documentation angegeben.

Hinweis: Das Umbenennen von Spalten in einer Tabelle mit einer enum Spalte wird derzeit nicht unterstützt.

Dies passiert, wenn Sie eine enum -Spalte in Ihrer Datenbanktabelle haben. Unabhängig davon, ob Sie versuchen, eine andere Spalte umzubenennen oder eine andere Spalte in nullable zu ändern, wird dieser Fehler angezeigt. Es ist ein Problem mit Doctrine\DBAL.

Eine einfache Lösung hierfür ist das Hinzufügen dieser Konstruktormethode zu Ihrer Datenbankmigrationsdatei.

public function __construct()
{
    DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
}

Dies ordnet alle ENUM Spalten VARCHAR() zu, und die Spalte akzeptiert eine beliebige Zeichenfolge.

Dies funktionierte für mich auf Laravel 5.1 und Laravel 5.3. Ich hoffe, dass dieser Fehler bald behoben werden kann.

Dank an @ Gmatkowskis Antwort umhttps: //stackoverflow.com/a/32860409/1193201

76
Xeleon

Eine wirklich schmutzige Lösung, bei der die Arbeit erledigt wird

update Doctrine/DBAL/Schema/MySqlSchemaManager.php 

indem Sie diese Zeilen direkt über der Zeile 113 einfügen

$this->_platform->registerDoctrineTypeMapping('enum', 'string');
$type = $this->_platform->getDoctrineTypeMapping($dbType);

Beachten Sie, dass das direkte Aktualisieren von Anbieterdateien nicht ratsam ist, da in diesem Fall vonder das Plugin aktualisieren möchte, könnten die Änderungen überschrieben werden

3

Ich werde dieses Problem los, indem ich eine neue Migrationsklasse erstellt und meine Migrationen davon ausdehne. Es gibt mehrere Möglichkeiten, mehr "Standard" zu machen, aber dies ist nur ein sehr einfacher Fall, der für mich perfekt funktioniert.

use Doctrine\DBAL\Types\{StringType, Type};
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\{DB, Log};

/**
 * Class ExtendedMigration
 * Use it when the involved table(s) has enum type column(s)
 */
class ExtendedMigration extends Migration
{
    /**
     * ExtendedMigration constructor.
     * Handle Laravel Issue related with modifying tables with enum columns
     */
    public function __construct()
    {
        try {
            DB::getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
            Type::addType('enum', StringType::class);
        } catch (\Exception $exception) {
            Log::info($exception->getMessage());
        }
    }
}

Dann, wie zuvor erklärt, erweitern Sie einfach Ihre Migration

class SampleMigration extends ExtendedMigration
{
    public function up()
    {
        Schema::create('invitations', function (Blueprint $table) {
            ...
            $table->enum('status', ['sent', 'consumed', 'expired'])->default('sent');
            ...
        });
    }

    public function down()
    {
        Schema::dropIfExists('invitations');
    }
}
1
Hector Manuel

Sie sollten überhaupt keine Aufzählung verwenden. Auch mit laravel 5.8 ist das Problem nicht gelöst.

Vielen Dank an alle, die daran erinnert haben

Die offizielle Laravel 5.1 Dokumentation lautet:

Hinweis: Das Umbenennen von Spalten in einer Tabelle mit einer Aufzählungsspalte wird derzeit nicht unterstützt.

Ich muss hinzufügen, dass Sie das gleiche Problem haben werden, wenn Sie verfügbare Optionen in die enum Spaltendeklaration einfügen.

Es bringt mich zu dem Schluss, dass Sie Enum mit Vorsicht verwenden sollten. oder sogar Sie sollten Enum überhaupt nicht verwenden .

Ich kann keine Antwort auf dieses Angebot abstimmen, die Aufzählung durch eine Zeichenfolge zu ersetzen. NEIN, Sie müssen eine Nachschlagetabelle erstellen und die Aufzählung durch unsignedInteger als foreign key Ersetzen.

Es ist eine Menge Arbeit und Sie werden verärgert sein, wenn Sie es ohne Unit-Test-Berichterstattung tun, aber dies ist eine richtige Lösung.

Möglicherweise werden Sie dafür sogar entlassen, weil es zu lange dauert, aber keine Sorge, Sie werden einen besseren Job finden. :)

Hier ist ein Beispiel dafür, wie schwierig es wäre , verfügbare Optionen in die enum-Spaltendeklaration einzufügen

sag du hast das:

Schema::create('blogs', function (Blueprint $table) {
    $table->enum('type', [BlogType::KEY_PAYMENTS]);
    $table->index(['type', 'created_at']);
...

und Sie müssen mehr Typen zur Verfügung stellen

public function up(): void
{
    Schema::table('blogs', function (Blueprint $table) {
        $table->dropIndex(['type', 'created_at']);
        $table->enum('type_tmp', [
            BlogType::KEY_PAYMENTS,
            BlogType::KEY_CATS,
            BlogType::KEY_DOGS,
        ])->after('type');
    });

    DB::statement('update `blogs` as te set te.`type_tmp` = te.`type` ');

    Schema::table('blogs', function (Blueprint $table) {
        $table->dropColumn('type');
    });

    Schema::table('blogs', function (Blueprint $table) {
        $table->enum('type', [
            BlogType::KEY_PAYMENTS,
            BlogType::KEY_CATS,
            BlogType::KEY_DOGS,
        ])->after('type_tmp');
    });

    DB::statement('update `blogs` as te set te.`type` = te.`type_tmp` ');

    Schema::table('blogs', function (Blueprint $table) {
        $table->dropColumn('type_tmp');
        $table->index(['type', 'created_at']);
    });
}
1

Ich denke, die einfachste Möglichkeit, dieses Problem zu beheben, ist das Hinzufügen eines Zuordnungstyps zu doctrine.yaml, falls zutreffend, damit die Aufzählung als Zeichenfolge behandelt wird.

doctrine:
    dbal:
        #other configuration
        mapping_types:
            enum: string
0
S. Mert