Datenbank - Tabellen
- rex_sql_table
- rex_sql_column
- rex_sql_index
- rex_sql_foreign_key
rex_sql_table
Mit der Klasse rex_sql_table
kann man die Struktur der Datenbanktabellen auslesen und verändern.
Die Klasse ist vor allem nützlich bei der Entwicklung von AddOns, um bei der Installation die nötigen Tabellen des AddOns anzulegen, bzw. sie bei der Deinstallation wieder zu löschen.
Beispiel für eine install.php
:
rex_sql_table::get(rex::getTable('foo'))
->ensurePrimaryIdColumn()
->ensureColumn(new rex_sql_column('title', 'varchar(255)'))
->ensureColumn(new rex_sql_column('description', 'text', true))
->ensureColumn(new rex_sql_column('status', 'tinyint(1)', false, 1))
->ensureIndex(new rex_sql_index('i_title', ['title']))
->ensure();
Durch diesen Code wird die Tabelle in der angegebenen Struktur sichergestellt. Sie wird also erstellt, falls noch nicht vorhanden, bzw. modifiziert, falls einzelne Spalten oder Indizes nicht der gewünschten Struktur entsprechen.
Tipp: Über das Adminer-AddOn kann man sich den
rex_sql_table
-Code für eine Tabelle generieren lassen. Alternativ ist dies auch möglich über den Konsolenbefehlredaxo/bin/console db:dump-schema <table>
.
Beispiel für eine uninstall.php
:
rex_sql_table::get(rex::getTable('foo'))->drop();
Abruf der Struktur
get
get($name)
Mit rex_sql_table::get($name)
holt man sich das Objekt zu der Tabelle mit dem Namen $name
. Diese Methode wird verwendet unabhängig davon, ob man eine existieren Tabelle abrufen, bzw. editieren möchte, oder ob man eine neue Tabelle erstellen möchte.
exists
exists()
Prüft, ob die Tabelle existiert ($table->exists()
).
getName
getName()
Gibt den Tabellennamen zurück.
hasColumn
hasColumn($name)
Prüft, ob die angegebene Spalte existiert.
getColumn
getColumn($name)
Liefert das rex_sql_column
-Objekt zu der angegebenen Spalte, oder null
falls die Spalte nicht existiert.
getColumns
getColumns()
Liefert ein Array mit allen Spalten der Tabelle als rex_sql_column
-Objekte.
getPrimaryKey
getPrimaryKey()
Liefert den Primärschlüssel der Tabelle als Array mit den Spaltennamen, zum Beispiel ['id']
.
hasIndex
hasIndex($name)
Prüft, ob der angegebene Index existiert.
getIndex
getIndex($name)
Liefert das rex_sql_index
-Objekt zu dem angegebenen Index, oder null
falls der Index nicht existiert.
getIndexes
getIndexes()
Liefert ein Array mit allen Indizes der Tabelle als rex_sql_index
-Objekte.
hasForeignKey
hasForeignKey($name)
Prüft, ob der angegebene Fremdschlüssel existiert.
getForeignKey
getForeignKey($name)
Liefert das rex_sql_foreign_key
-Objekt zu dem angegebenen Fremdschlüssel, oder null
falls der Fremdschlüssel nicht existiert.
getForeignKeys
getForeignKeys()
Liefert ein Array mit allen Fremdschlüsseln der Tabelle als rex_sql_foreign_key
-Objekte.
Änderungen ausführen
create
create()
Erstellt die Tabelle mit der zuvor angegebenen Definition. Falls die Tabelle bereits existiert, wird eine Exception geworfen.
alter
alter()
Ändert die Tabelle entsprechend der zuvor angegebenen Änderungen. Falls die Tabelle noch nicht existiert, wird eine Exception geworfen.
ensure
ensure()
Stellt die zuvor angegebene Definition sicher. Falls die Tabelle noch nicht existiert, wird sie angelegt. Ansonsten wird sie bei Bedarf entsprechend der Definition geändert. Dabei wird auch sichergestellt, dass die Spalten in der definierten Reihenfolge (Reihenfolge der ensureColumn()
-Aufrufe, oder über explizite Positionsangaben) vorliegen. Daher sollte diese Methode nur verwendet werden, wenn die komplette Tabellen-Definition angegeben wurde, die sicherzustellen ist. Bei Angabe von nur einzelnen Änderungen sollte stattdessen alter()
verwendet werden.
drop
drop()
Löscht die Tabelle. Falls sie gar nicht existiert, macht die Methode nichts, es wird also keine Exception geworfen.
Änderungen definieren
Die folgenden Methoden führen die jeweiligen Änderungen nicht sofort aus, sondern dafür bedarf es immer den Aufruf einer der Methoden create()
, alter()
oder ensure()
.
setName
setName($name)
Ändert den Tabellennamen.
addColumn
addColumn(rex_sql_column $column, $afterColumn = null)
Fügt eine neue Spalte hinzu. Falls eine Spalte mit dem Namen bereits existiert, wird eine Exception geworfen.
Optional kann die Position für die neue Spalte mit dem zweiten Parameter gesetzt werden, entweder durch Angabe eines anderen Spaltennamens, nach der die Spalte eingefügt werden soll, oder rex_sql_table::FIRST
.
ensureColumn
ensureColumn(rex_sql_column $column, $afterColumn = null)
Stellt sicher, dass die Spalte mit der angegebenen Definition existiert. Die Spalte wird also ggf. angelegt oder geändert.
Optional kann die Position für die neue Spalte mit dem zweiten Parameter gesetzt werden, entweder durch Angabe eines anderen Spaltennamens, nach der die Spalte eingefügt werden soll, oder rex_sql_table::FIRST
.
ensurePrimaryIdColumn
ensurePrimaryIdColumn()
Dies ist eine Shortcut-Methode für diesen Aufruf:
$table
->ensureColumn(new rex_sql_column('id', 'int(10) unsigned', false, null, 'auto_increment'))
->setPrimaryKey('id');
ensureGlobalColumns
ensureGlobalColumns()
Dies ist eine Shortcut-Methode für diesen Aufruf:
$table
->ensureColumn(new rex_sql_column('createdate', 'datetime'))
->ensureColumn(new rex_sql_column('createuser', 'varchar(255)'))
->ensureColumn(new rex_sql_column('updatedate', 'datetime'))
->ensureColumn(new rex_sql_column('updateuser', 'varchar(255)'));
renameColumn
renameColumn($oldName, $newName)
Benennt eine Spalte um.
removeColumn
removeColumn($name)
Entfernt eine Spalte.
setPrimaryKey
setPrimaryKey($columns)
Setzt den Primärschlüssel. Falls dieser nur für eine Spalte gesetzt werden soll, kann diese als String angegeben werden ($table->setPrimaryKey('id')
), ansonsten als Array ($table->setPrimaryKey(['namespace', 'key'])
).
addIndex
addIndex(rex_sql_index $index)
Fügt einen neuen Index hinzu. Falls ein Index mit dem Namen bereits existiert, wird eine Exception geworfen.
ensureIndex
ensureIndex(rex_sql_index $index)
Stellt sicher, dass der Index mit der angegebenen Definition existiert. Der Index wird also ggf. angelegt, oder geändert.
renameIndex
renameIndex($oldName, $newName)
Benennt einen Index um.
removeIndex
removeIndex($name)
Entfernt einen Index.
addForeignKey
addForeignKey(rex_sql_foreign_key $foreignKey)
Fügt einen neuen Fremdschlüssel hinzu. Falls ein Fremdschlüssel mit dem Namen bereits existiert, wird eine Exception geworfen.
ensureForeignKey
ensureForeignKey(rex_sql_foreign_key $foreignKey)
Stellt sicher, dass der Fremdschlüssel mit der angegebenen Definition existiert. Der Fremdschlüssel wird also ggf. angelegt oder geändert.
renameForeignKey
renameForeignKey($oldName, $newName)
Benennt einen Fremdschlüssel um.
removeForeignKey
removeForeignKey($name)
Entfernt einen Fremdschlüssel.
rex_sql_column
new rex_sql_column($name, $type, $nullable = false, $default = null, $extra = null)
Parameter | Erklärung |
---|---|
$name |
Name der Spalte |
$type |
Typ der Spalte als String, zum Beispiel varchar(255) , int(10) unsigned , datetime ... |
$nullable |
Definiert, ob die Spalte auch den Wert null erlaubt (true /false ) |
$default |
Default-Wert der Spalte |
$extra |
Zusätzeliche Spaltendefinitionen, wie zum Beispiel 'auto_increment' . |
Über die Methoden getName()
, getType()
, isNullable()
, getDefault()
und getExtra()
können die Werte abgefragt werden.
rex_sql_index
new rex_sql_index($name, array $columns, $type = self::INDEX)
Parameter | Erklärung |
---|---|
$name |
Name des Indexes |
$columns |
Array mit den Spaltennamen, auf die sich der Index beziehen soll (z. B. ['id', 'clang_id'] ) |
$type |
Index-Typ: `rex_sql_index ::INDEX(default), rex_sql_index::UNIQUEoder rex_sql_index::FULLTEXT` |
Über die Methoden getName()
, getColumns()
und getType()
können die Werte abgefragt werden.
rex_sql_foreign_key
new rex_sql_foreign_key($name, $table, array $columns, $onUpdate = self::RESTRICT, $onDelete = self::RESTRICT)
Parameter | Erklärung |
---|---|
$name |
Name des Fremdschlüssels |
$table |
Name der Tabelle, die über den Fremdschlüssel referenziert wird |
$columns |
Assoziatives Array, welches die Spalten des Fremdschlüssels den Spalten in der referenzierten Tabelle zuordnet (z. B. ['foo_id' => 'id'] ) |
$onUpdate |
ON UPDATE -Aktion: rex_sql_foreign_key::RESTRICT (default), rex_sql_foreign_key::CASCADE oder rex_sql_foreign_key::SET_NULL |
$onDelete |
ON DELETE -Aktion: rex_sql_foreign_key::RESTRICT (default), rex_sql_foreign_key::CASCADE oder rex_sql_foreign_key::SET_NULL |
Über die Methoden getName()
, getTable()
, getColumns()
, getOnUpdate()
und getOnDelete()
können die Werte abgefragt werden.
Artikel bearbeiten