Models
Models definieren das Datenbankschema (Spalten, Constraints, Indizes und Beziehungen) und ermöglichen CRUD-Operationen. Jedes Model repräsentiert genau eine Tabelle, die Instanzen eines Models entsprechen also Zeilen dieser Tabelle und werden über den Primärschlüssel identifiziert.
Deklaration
Models liegen im Ordner app/Models
und erben von RHRZ\ORM\Model
. Das Schema wird in der Methode init
definiert, die vom ORM eine Instanz der Klasse RHRZ\ORM\Schema\Table
übergeben bekommt.
namespace App\Models;
use RHRZ\ORM\Model;
use RHRZ\ORM\Schema\Column;
use RHRZ\ORM\Schema\Table;
/**
* @mixin Mixins\ProductMixin
*/
class Product extends Model
{
protected static function init(Table $table): void
{
// Diese drei Optionen können bei Bedarf überschrieben werden.
//$table->setName('...');
//$table->setTimestamps(true);
//$table->setSoftDelete(false);
// Die Tabellenspalten werden durch Column-Instanzen definiert.
$table->setColumns([
'category_id' => Column::fk(Category::class),
'name' => Column::string(50)->unique(),
'description' => Column::text()->nullable(),
'price' => Column::decimal(),
'public' => Column::bool(),
]);
// Anschließend werden Beziehungen definiert.
// todo ...
}
}
Tabellenname
Standardmäßig wird als Tabellenname der Klassenname in snake_case
verwendet, er kann jedoch mit $table->setName(string $name = null)
überschrieben werden. Um den Zusammenhang mit dem Model zu verdeutlichen, sollte der Singular verwendet werden.
Falls in der Datei env.php
die Option db.prefix
gesetzt ist, wird das Präfix automatisch vor alle Tabellennamen gesetzt, getrennt durch einen Unterstrich. Dadurch wird ermöglicht, dieselbe Datenbank-Instanz für mehrere Framework-Projekte zu verwenden.
Tabellenspalten
Die Tabellenspalten werden mit der Methode $table->setColumns(array $columns)
definiert, die ein assoziatives Array aus Spaltennamen und Column
-Instanzen erwartet. Dabei wird die Primärschlüsselspalte id
nicht angegeben, da sie für jede Tabelle existiert.
Zusätzlich gibt es drei Timestamp-Spalten, deren Werte automatisch durch den ORM verwaltet werden.
created_at
gibt an, wann ein Datensatz erstellt wurde.updated_at
gibt an, wann ein Datensatz zuletzt geändert wurde.deleted_at
gibt an, wann ein Datensatz durch Soft-Delete gelöscht wurde.
Die Spalten created_at
und updated_at
sind standardmäßig für jedes Model aktiviert, können aber bei Bedarf mit der Methode setTimestamps(bool $value)
der Klasse Table
deaktiviert werden.
Das Feature Soft-Delete und die Spalte deleted_at
sind standardmäßig deaktiviert und müssen bei Bedarf mit der Methode setSoftDelete(bool $value)
der Klasse Table
aktiviert werden.
Constraints und Indizes
Constraints und Indizes, die sich auf einzelne Spalten beziehen, werden direkt bei der jeweiligen Column
-Instanz definiert (siehe Verhalten).
Mehrspaltige UNIQUE
-Constraints werden mit der Methode addUniqueConstraint(array $columns)
der Klasse Table
definiert.
$table->addUniqueConstraint(['col1', 'col2', '...']);
Beziehungen
Fremdschlüssel werden mit Column::fk(...)
als Spalte definiert. Alle anderen Arten von Beziehungen werden über diverse Methoden der Klasse Table
definiert. Beispiele finden sich in den jeweiligen Kapiteln.
Mixins
todo
Caching
todo
Computed Properties
todo