- rex_sql_table
- rex_sql_column
- rex_sql_index
- rex_sql_foreign_key
- rex_sql_util
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();
get($name,$db)
Mit rex_sql_table::get($name)
holt man sich das Objekt zu der Tabelle mit dem Namen $name
und optional der Datebank $db (numerisch muss in der config.yml von REDAXO hinterlegt sein). 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()
Prüft, ob die Tabelle existiert ($table->exists()
).
getName()
Gibt den Tabellennamen zurück.
hasColumn($name)
Prüft, ob die angegebene Spalte existiert.
getColumn($name)
Liefert das rex_sql_column
-Objekt zu der angegebenen Spalte, oder null
falls die Spalte nicht existiert.
getColumns()
Liefert ein Array mit allen Spalten der Tabelle als rex_sql_column
-Objekte.
getPrimaryKey()
Liefert den Primärschlüssel der Tabelle als Array mit den Spaltennamen, zum Beispiel ['id']
.
hasIndex($name)
Prüft, ob der angegebene Index existiert.
getIndex($name)
Liefert das rex_sql_index
-Objekt zu dem angegebenen Index, oder null
falls der Index nicht existiert.
getIndexes()
Liefert ein Array mit allen Indizes der Tabelle als rex_sql_index
-Objekte.
hasForeignKey($name)
Prüft, ob der angegebene Fremdschlüssel existiert.
getForeignKey($name)
Liefert das rex_sql_foreign_key
-Objekt zu dem angegebenen Fremdschlüssel, oder null
falls der Fremdschlüssel nicht existiert.
getForeignKeys()
Liefert ein Array mit allen Fremdschlüsseln der Tabelle als rex_sql_foreign_key
-Objekte.
create()
Erstellt die Tabelle mit der zuvor angegebenen Definition. Falls die Tabelle bereits existiert, wird eine Exception geworfen.
alter()
Ändert die Tabelle entsprechend der zuvor angegebenen Änderungen. Falls die Tabelle noch nicht existiert, wird eine Exception geworfen.
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()
Löscht die Tabelle. Falls sie gar nicht existiert, macht die Methode nichts, es wird also keine Exception geworfen.
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($name)
Ändert den Tabellennamen.
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(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()
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()
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($oldName, $newName)
Benennt eine Spalte um.
removeColumn($name)
Entfernt eine Spalte.
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(rex_sql_index $index)
Fügt einen neuen Index hinzu. Falls ein Index mit dem Namen bereits existiert, wird eine Exception geworfen.
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($oldName, $newName)
Benennt einen Index um.
removeIndex($name)
Entfernt einen Index.
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(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($oldName, $newName)
Benennt einen Fremdschlüssel um.
removeForeignKey($name)
Entfernt einen Fremdschlüssel.
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.
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::UNIQUE` oder `rex_sql_index::FULLTEXT` |
Über die Methoden getName()
, getColumns()
und getType()
können die Werte abgefragt werden.
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.
Beim Kopieren von REDAXO-Tabellen wird nicht automatisch der Prefix gesetzt.
// Nur Tabellenstruktur kopieren von rex_table1 zu neuer Tabelle rex_table2
rex_sql_util::copyTable('rex_table1', 'rex_table2');
// Tabellenstruktur und Daten kopieren
rex_sql_util::copyTableWithData('rex_table1', 'rex_table2');
rex_sql_util::copyTableWithData(rex::getTablePrefix() . 'old_data',rex::getTablePrefix() . 'new_data');