Skip to content

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.

php
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.

php
$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