Projects [SHOW]
Database
Einführung
Migrationen sind wie eine Versionskontrolle für Ihre Datenbank, die es Ihrem Team ermöglicht, das Datenbankschema der Anwendung einfach zu ändern und gemeinsam zu nutzen. Migrationen werden typischerweise mit Laravel's Schema Builder gepaart, um das Datenbankschema Ihrer Anwendung einfach zu erstellen. Wenn Sie jemals einem Teamkollegen sagen mussten, dass er eine Spalte manuell zu seinem lokalen Datenbankschema hinzufügen soll, haben Sie das Problem, das Datenbankmigrationen lösen, kennengelernt.
Die Laravel Schema Fassade bietet datenbankunabhängige Unterstützung für die Erstellung und Manipulation von Tabellen in allen von Laravel unterstützten Datenbanksystemen.
more themes about Database - Click for open
Generating Migrations
Um eine Migration zu erstellen, verwenden Sie den Artisan Befehl make:migration:
php artisan make:migration create_users_table
Die neue Migration wird in Ihrem Datenbank-/Migrationsverzeichnis (database/migrations directory) abgelegt. Jeder Name der Migrationsdatei enthält einen Zeitstempel, der es Laravel erlaubt, die Reihenfolge der Migrationen zu bestimmen.
Die --table und --create Optionen können auch verwendet werden, um den Namen der Tabelle anzugeben und ob die Migration eine neue Tabelle erstellen wird. Diese Optionen füllen die generierte Migrations-Stub-Datei mit der angegebenen Tabelle vor:
php artisan make:migration create_users_table --create=users
php artisan make:migration add_votes_to_users_table --table=users
Wenn Sie einen benutzerdefinierten Ausgabepfad für die generierte Migration angeben möchten, können Sie bei der Ausführung des Befehls make:migration die Option --path verwenden. Der angegebene Pfad sollte relativ zum Basispfad Ihrer Anwendung sein.
Migration Structure
Eine Migrationsklasse enthält zwei Methoden: up und down. Die up-Methode wird verwendet, um neue Tabellen, Spalten oder Indizes zu Ihrer Datenbank hinzuzufügen, während die down-Methode die von der up-Methode ausgeführten Operationen umkehren sollte.
Innerhalb dieser beiden Methoden können Sie den Laravel-Schema-Builder verwenden, um ausdrucksstarke Tabellen zu erstellen und zu modifizieren. Um mehr über alle verfügbaren Methoden des Schema-Builders zu erfahren, schauen Sie sich seine Dokumentation an. Dieses Migrationsbeispiel erstellt beispielsweise eine Flugtabelle:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFlightsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
}
Running Migrations
Um alle Ihre ausstehenden Migrationen auszuführen, führen Sie den Artisan-Befehl migrate aus:
php artisan migrate
Forcing Migrations To Run In Production
Einige Migrationsoperationen sind destruktiv, was bedeutet, dass sie zu Datenverlusten führen können. Um Sie vor der Ausführung dieser Befehle gegen Ihre Produktionsdatenbank zu schützen, werden Sie vor der Ausführung der Befehle zur Bestätigung aufgefordert. Um die Ausführung der Befehle ohne eine Eingabeaufforderung zu erzwingen, verwenden Sie das Kennzeichen --force:
php artisan migrate --force
Rolling Back Migrations
Um den letzten Migrationsvorgang rückgängig zu machen, können Sie den Rollback-Befehl verwenden. Dieser Befehl rollt den letzten "Batch" von Migrationen zurück, der mehrere Migrationsdateien enthalten kann:
php artisan migrate:rollback
Sie können eine begrenzte Anzahl von Migrationen rückgängig machen, indem Sie dem Rollback-Befehl die step-Option zur Verfügung stellen. Der folgende Befehl führt beispielsweise ein Rollback der letzten fünf Migrationen durch:
php artisan migrate:rollback --step=5
Mit dem Befehl migrate:reset werden alle Migrationen Ihrer Anwendung zurückgesetzt:
php artisan migrate:reset
Rollback & Migrate In Single Command
Der Befehl migrate:refresh rollt alle Ihre Migrationen zurück und führt dann den Befehl migrate aus. Dieser Befehl erstellt effektiv Ihre gesamte Datenbank neu:
php artisan migrate:refresh
// Refresh the database and run all database seeds...
php artisan migrate:refresh --seed
Sie können eine begrenzte Anzahl von Migrationen rückgängig machen und neu migrieren, indem Sie die step-Option für den refresh-Befehl bereitstellen. Der folgende Befehl rollt beispielsweise die letzten fünf Migrationen zurück und migriert sie erneut:
php artisan migrate:refresh --step=5
Drop All Tables & Migrate
Der Befehl migrate:refresh löscht alle Tabellen aus der Datenbank und führt dann den Befehl migrate aus:
php artisan migrate:fresh
php artisan migrate:fresh --seed
Tables
Creating Tables
Um eine neue Datenbanktabelle zu erstellen, verwenden Sie die create-Methode auf der Fassade Schema. Die create-Methode akzeptiert zwei Argumente. Das erste ist der Name der Tabelle, während das zweite ein Closure ist, das ein Blueprint-Objekt erhält, das zur Definition der neuen Tabelle verwendet werden kann:
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
});
Beim Anlegen der Tabelle können Sie jede beliebige column-Methode des Schema-Builders verwenden, um die Spalten der Tabelle zu definieren.
Checking For Table / Column Existence
Mit den Methoden hasTable und hasColumn können Sie leicht auf die Existenz einer Tabelle oder Spalte überprüfen:
if (Schema::hasTable('users')) {
//
}
if (Schema::hasColumn('users', 'email')) {
//
}
Database Connection & Table Options
Wenn Sie eine Schemaoperation auf einer Datenbankverbindung durchführen möchten, die nicht Ihre Standardverbindung ist, verwenden Sie die connection-Methode:
Schema::connection('foo')->create('users', function (Blueprint $table) {
$table->bigIncrements('id');
});
Sie können die folgenden Befehle im Schema Builder verwenden, um die Optionen der Tabelle zu definieren:
Befehl | Beschreibung |
---|---|
|
Geben Sie die Tabellenspeicher-Engine (MySQL) an. |
|
Geben Sie einen Standard-Zeichensatz für die Tabelle an (MySQL). |
|
Geben Sie eine Standard-Kollation für die Tabelle an (MySQL). |
|
Erstellen Sie eine temporäre Tabelle (außer SQL Server). |
Renaming / Dropping Tables
Um eine bestehende Datenbanktabelle umzubenennen, verwenden Sie die rename-Methode:
Schema::rename($from, $to);
Um eine bestehende Tabelle zu löschen, können Sie die Methoden drop oder dropIfExists verwenden:
Schema::drop('users');
Schema::dropIfExists('users');
Renaming Tables With Foreign Keys
Bevor Sie eine Tabelle umbenennen, sollten Sie überprüfen, ob alle Fremdschlüssel-Einschränkungen auf der Tabelle einen expliziten Namen in Ihren Migrationsdateien haben, anstatt Laravel einen auf Konvention basierenden Namen zuweisen zu lassen. Andernfalls wird der Name der Fremdschlüsselbeschränkung auf den alten Tabellennamen verweisen.
Columns
Creating Columns
Mit der table-Methode auf der Fassade Schema können Sie bestehende Tabellen aktualisieren. Wie die create-Methode akzeptiert die table-Methode zwei Argumente: den Namen der Tabelle und einen Closure, der eine Blueprint-Instanz erhält, mit der Sie der Tabelle Spalten hinzufügen können:
Schema::table('users', function (Blueprint $table) {
$table->string('email');
});
Available Column Types
Der Schema-Builder enthält eine Vielzahl von Spaltentypen, die Sie beim Aufbau Ihrer Tabellen angeben können:
Befehl | Beschreibung |
---|---|
|
Auto-incrementing UNSIGNED BIGINT (primary key) equivalent column. |
|
BIGINT equivalent column. |
|
BLOB equivalent column. |
|
BOOLEAN equivalent column. |
|
CHAR equivalent column with an optional length. |
|
DATE equivalent column. |
|
DATETIME equivalent column. |
|
DATETIME (with timezone) equivalent column. |
|
DECIMAL equivalent column with a precision (total digits) and scale (decimal digits). |
|
DOUBLE equivalent column with a precision (total digits) and scale (decimal digits). |
|
ENUM equivalent column. |
|
FLOAT equivalent column with a precision (total digits) and scale (decimal digits). |
|
GEOMETRY equivalent column. |
|
GEOMETRYCOLLECTION equivalent column. |
|
Auto-incrementing UNSIGNED INTEGER (primary key) equivalent column. |
|
INTEGER equivalent column. |
|
IP address equivalent column. |
|
JSON equivalent column. |
|
JSONB equivalent column. |
|
LINESTRING equivalent column. |
|
LONGTEXT equivalent column. |
|
MAC address equivalent column. |
|
Auto-incrementing UNSIGNED MEDIUMINT (primary key) equivalent column. |
|
MEDIUMINT equivalent column. |
|
MEDIUMTEXT equivalent column. |
|
Adds
UNSIGNED BIGINT and
VARCHAR equivalent columns. |
|
Adds
CHAR(36) and
VARCHAR(255) UUID equivalent columns. |
|
MULTILINESTRING equivalent column. |
|
MULTIPOINT equivalent column. |
|
MULTIPOLYGON equivalent column. |
|
Adds nullable versions of
columns. |
|
Adds nullable versions of
columns. |
|
Alias of
method. |
|
POINT equivalent column. |
|
POLYGON equivalent column. |
|
Adds a nullable
VARCHAR(100) equivalent column. |
|
SET equivalent column. |
|
Auto-incrementing UNSIGNED SMALLINT (primary key) equivalent column. |
|
SMALLINT equivalent column. |
|
Adds a nullable
TIMESTAMP equivalent column for soft deletes. |
|
Adds a nullable
TIMESTAMP (with timezone) equivalent column for soft deletes. |
|
VARCHAR equivalent column with a optional length. |
|
TEXT equivalent column. |
|
TIME equivalent column. |
|
TIME (with timezone) equivalent column. |
|
TIMESTAMP equivalent column. |
|
TIMESTAMP (with timezone) equivalent column. |
|
Adds nullable
and
TIMESTAMP equivalent columns. |
|
Adds nullable
and
TIMESTAMP (with timezone) equivalent columns. |
|
Auto-incrementing UNSIGNED TINYINT (primary key) equivalent column. |
|
TINYINT equivalent column. |
|
UNSIGNED BIGINT equivalent column. |
|
UNSIGNED DECIMAL equivalent column with a precision (total digits) and scale (decimal digits). |
|
UNSIGNED INTEGER equivalent column. |
|
UNSIGNED MEDIUMINT equivalent column. |
|
UNSIGNED SMALLINT equivalent column. |
|
UNSIGNED TINYINT equivalent column. |
|
UUID equivalent column. |
|
YEAR equivalent column. |
Column Modifiers
Zusätzlich zu den oben aufgeführten Spaltentypen gibt es mehrere Spalten-"Modifikatoren", die Sie beim Hinzufügen einer Spalte zu einer Datenbanktabelle verwenden können. Um die Spalte z.B. "löschbar" zu machen, können Sie die "nullable"-Methode verwenden:
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
Unten ist eine Liste aller verfügbaren Spaltenmodifikatoren. Diese Liste enthält nicht die Indexmodifikatoren:
Modifikator | Beschreibung |
---|---|
|
Place the column "after" another column (MySQL) |
|
Set INTEGER columns as auto-increment (primary key) |
|
Specify a character set for the column (MySQL) |
|
Specify a collation for the column (MySQL/PostgreSQL/SQL Server) |
|
Add a comment to a column (MySQL/PostgreSQL) |
|
Specify a "default" value for the column |
|
Place the column "first" in the table (MySQL) |
|
Allows (by default) NULL values to be inserted into the column |
|
Create a stored generated column (MySQL) |
|
Set INTEGER columns as UNSIGNED (MySQL) |
|
Set TIMESTAMP columns to use CURRENT_TIMESTAMP as default value |
|
Create a virtual generated column (MySQL) |
|
Create an identity column with specified sequence options (PostgreSQL) |
|
Defines the precedence of sequence values over input for an identity column (PostgreSQL) |
Modifying Columns
Prerequisites (Voraussetzungen)
Bevor Sie eine Spalte ändern, fügen Sie die doctrine/dbal Abhängigkeit zu Ihrer composer.json Datei hinzu. Die Doctrine DBAL-Bibliothek wird verwendet, um den aktuellen Zustand der Spalte zu ermitteln und die SQL-Abfragen zu erstellen, die für die angegebenen Anpassungen der Spalte erforderlich sind:
composer require doctrine/dbal
Updating Column Attributes
Die change-Methode erlaubt es Ihnen, einige bestehende Spaltentypen auf einen neuen Typ zu ändern oder die Attribute der Spalte zu modifizieren. Beispielsweise können Sie die Größe einer String-Spalte erhöhen. Um die change-Methode in Aktion zu sehen, lassen Sie uns die Größe der Namensspalte von 25 auf 50 erhöhen:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});
Wir könnten auch eine Spalte so modifizieren, dass sie löschbar ist:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->nullable()->change();
});
Renaming Columns
Um eine Spalte umzubenennen, können Sie die Methode renameColumn im Schema-Builder verwenden. Bevor Sie eine Spalte umbenennen, stellen Sie sicher, dass Sie die doctrine/dbal-Abhängigkeit zu Ihrer composer.json-Datei hinzufügen:
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
Dropping Columns
Um eine Spalte zu löschen, verwenden Sie die dropColumn-Methode im Schema-Builder. Bevor Sie Spalten aus einer SQLite-Datenbank löschen, müssen Sie die doctrine/dbal-Abhängigkeit zu Ihrer composer.json-Datei hinzufügen und den composer update Befehl in Ihrem Terminal ausführen, um die Bibliothek zu installieren:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
Sie können mehrere Spalten aus einer Tabelle löschen, indem Sie ein Array mit Spaltennamen an die dropColumn-Methode übergeben:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
Available Command Aliases
Befehl | Beschreibung |
---|---|
|
Löscht die Spalten morphable_id und morphable_type. |
|
Löscht die Spalte remember_token. |
|
Löscht die Spalte deleted_at. |
|
Alias der dropSoftDeletes()-Methode. |
|
Löscht die Spalten created_at und updated_at. |
|
Alias der dropTimestamps()-Methode. |
Indexes
Creating Indexes
Der Schema-Builder unterstützt mehrere Arten von Indizes. Zuerst schauen wir uns ein Beispiel an, das angibt, dass die Werte einer Spalte eindeutig sein sollten. Um den Index zu erstellen, können wir die unique-Methode mit der Spaltendefinition verketten:
$table->string('email')->unique();
Alternativ können Sie den Index nach der Definition der Spalte erstellen. Zum Beispiel:
$table->unique('email');
Sie können sogar ein Array von Spalten an eine Indexmethode übergeben, um einen zusammengesetzten (oder zusammengesetzten) Index zu erstellen:
$table->index(['account_id', 'created_at']);
Laravel wird automatisch einen vernünftigen Indexnamen generieren, aber Sie können der Methode ein zweites Argument übergeben, um den Namen selbst zu spezifizieren:
$table->unique('email', 'unique_email');
Available Index Types
Jede Indexmethode akzeptiert ein optionales zweites Argument, um den Namen des Indexes anzugeben. Wenn es weggelassen wird, wird der Name aus den Namen der Tabelle und der Spalte(n) abgeleitet.
Befehl | Beschreibung |
---|---|
|
Fügt einen Primärschlüssel hinzu. |
|
Fügt zusammengesetzte Schlüssel hinzu. |
|
Fügt einen eindeutigen Index hinzu. |
|
Fügt einen einfachen Index hinzu. |
|
Fügt einen räumlichen Index hinzu. (außer SQLite) |
Index Lengths & MySQL / MariaDB
Laravel verwendet standardmäßig den Zeichensatz utf8mb4, der auch die Speicherung von "Emojis" in der Datenbank unterstützt. Wenn Sie eine Version von MySQL älter als das 5.7.7-Release oder MariaDB älter als das 10.2.2-Release verwenden, müssen Sie möglicherweise die von Migrationen generierte Standard-Stringlänge manuell konfigurieren, damit MySQL Indizes für sie erstellt. Sie können dies konfigurieren, indem Sie die Schema::defaultStringLength-Methode innerhalb Ihres AppServiceProviders aufrufen:
use Illuminate\Support\Facades\Schema;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
}
Alternativ können Sie die Option innodb_large_prefix für Ihre Datenbank aktivieren. Lesen Sie in der Dokumentation Ihrer Datenbank nach, wie Sie diese Option korrekt aktivieren können.
Renaming Indexes
Um einen Index umzubenennen, können Sie die renameIndex-Methode verwenden. Diese Methode akzeptiert den aktuellen Indexnamen als erstes Argument und den gewünschten Namen als zweites Argument:
$table->renameIndex('from', 'to')
Dropping Indexes
Um einen Index zu löschen, müssen Sie den Namen des Indexes angeben. Standardmäßig vergibt Laravel automatisch einen sinnvollen Namen für die Indizes. Sie verknüpfen den Tabellennamen, den Namen der indizierten Spalte und die Indexart. Hier sind einige Beispiele:
Befehl | Beschreibung |
---|---|
|
Löschen Sie einen Primärschlüssel aus der Tabelle "users". |
|
Löschen Sie einen eindeutigen Index aus der Tabelle "users". |
|
Löschen Sie einen BasisIndex aus der Tabelle "geo". |
|
Löschen Sie einen räumlichen Index aus der Tabelle "geo" (außer SQLite). |
Wenn Sie ein Array von Spalten an eine Methode übergeben, die Indizes fallen lässt, wird der konventionelle Indexname basierend auf dem Tabellennamen, den Spalten und dem Schlüsseltyp generiert:
Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Drops index 'geo_state_index'
});
Foreign Key Constraints
Laravel bietet auch Unterstützung für die Erstellung von Fremdschlüssel-Bedingungen, die verwendet werden, um die referentielle Integrität auf Datenbankebene zu erzwingen. Lassen Sie uns zum Beispiel eine user_id Spalte auf der posts Tabelle definieren, die die id Spalte auf einer user Tabelle referenziert:
Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
Sie können auch die gewünschte Aktion für die "on delete" und "on update" Eigenschaften des Constraints angeben:
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Um einen Fremdschlüssel zu löschen, können Sie die dropForeign-Methode verwenden. Fremdschlüssel-Einschränkungen verwenden die gleiche Namenskonvention wie Indizes. Wir werden also den Tabellennamen und die Spalten im Constraint verknüpfen und den Namen mit "_foreign" anhängen:
$table->dropForeign('posts_user_id_foreign');
Oder Sie können einen Array-Wert übergeben, der beim Fallenlassen automatisch den konventionellen Constraint-Namen verwendet:
$table->dropForeign(['user_id']);
Sie können Fremdschlüsseleinschränkungen innerhalb Ihrer Migrationen mit den folgenden Methoden aktivieren oder deaktivieren:
Schema::enableForeignKeyConstraints();
Schema::disableForeignKeyConstraints();