Wer sein Code Testgetrieben schreibt und bei Laravel seine Testdatenbank auf SQLITE geschaltet hat, wird eventuell auf ein SQLITE Problem treffen, wenn man in seiner Migration Datei ein Enum Feld hat. Da kann zum Beispiel solch eine Fehlermeldung kommen:
Tests\Feature\CustomerTest > created customer and found by email
Illuminate\Database\QueryException
SQLSTATE[HY000]: General error: 1 no such table: customers (SQL: insert into "customers" ("organisation_or_person", "gender", "first_name", "last_name", "email", "phone", "place", "street", "street_number", "zip_code", "country", "updated_at", "created_at") values (organisation, male, John, Steiner, martin@martin.com, 0272516913, Wegberg, Behrensallee, 6, 12989, de, 2020-11-07 14:43:45, 2020-11-07 14:43:45))
Hier ein kleiner Hinweis wie man seine Testdatenbank auf Sqlite einstellt. Geht dazu in die phpunit.xml Datei und tragt folgende zwei Zeilen in den php Block ein. In den jüngsten Laravel Versionen sind die Felder bereits vorhanden und es muss nur noch die Auskommentierung gelöscht werden.
<server name=”DB_CONNECTION” value=”sqlite”/>
<server name=”DB_DATABASE” value=”:memory:”/>
Dann sieht das ganze wie folgt aus:
<php>
<server name=”APP_ENV” value=”testing”/>
<server name=”BCRYPT_ROUNDS” value=”4″/>
<server name=”CACHE_DRIVER” value=”array”/>
<server name=”DB_CONNECTION” value=”sqlite”/><!—->
<server name=”DB_DATABASE” value=”:memory:”/><!—->
<server name=”MAIL_MAILER” value=”array”/>
<server name=”QUEUE_CONNECTION” value=”sync”/>
<server name=”SESSION_DRIVER” value=”array”/>
<server name=”TELESCOPE_ENABLED” value=”false”/>
</php>
Zurück zum eigentlich Problem. Das Problem ist auch sehr simpel. SQLITE kennt keine ENUM Felder. Es kennt auch keine JSON Felder so wie MySQL. Deshalb ändern wir für unsere Testdurchläufe den Type von enum zu string. Packen das aber vorher in eine Bedingung. Und zwar, soll das nur passieren, wenn wir einen Test fahren. Geht zu euren Migration Dateien wo die ENUM Felder drin sind und baut die Condition if (config(‘app.env‘ === ‘testing‘) {} ein.
Die If Condition sieht dann in eurer Migration Datei so aus.
public function up()
{
if (config('app.env') === 'testing' ) {
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->string("organisation_or_person");
$table->string("gender");
$table->string("first_name");
// ...
});
} else {
Schema::create('customers', function (Blueprint $table) {
$table->id();
$table->enum("organisation_or_person", ["organisation", "person"]);
$table->enum("gender", ["male","female"]);
$table->string("first_name");
// ...
}
}
Für den einen oder anderen mag das vielleicht nicht ausreichen. Es gibt auch einen weiteren Weg, wie man ENUM Felder in SQLITE zum laufen bringt. externer Link