Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

ORM und Active Record: eZPersistentObject

Die Antwort von Exponential auf Eloquent, Doctrine, das Django-ORM und ActiveRecord für Ihre eigenen Tabellen - eZPersistentObject mit einem definition()-Array, fetchObject, fetchObjectList, count, store und remove…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/web-framework-developers/orm-and-ezpersistentobject.md

On this page

This page is a translation. Read the English original

ORM und Active Record: eZPersistentObject

Diese Seite richtet sich an Entwickler, die Daten mit Eloquent, Doctrine, dem Django-ORM oder dem ActiveRecord von Rails modellieren. Exponential bietet zwei Antworten. Für Daten, die Redakteure anlegen und pflegen, gibt es das Inhaltsmodell (Klassen, Objekte, Versionen), das Sie konfigurieren statt programmieren (Das Inhaltsmodell für ORM-Nutzer). Für die eigenen Tabellen Ihrer Anwendung gibt es eZPersistentObject (kernel/classes/ezpersistentobject.php), eine kleine Active-Record-Basisklasse, die der Kernel selbst für seine Tabellen verwendet (eZSection, eZRole und viele weitere).

Inhalt

  1. Inhaltsklasse oder eigene Tabelle?
  2. Ein Modell
  3. Lesen und Schreiben
  4. Relationen
  5. Transaktionen
  6. Im Vergleich mit vollständigen ORMs

Inhaltsklasse oder eigene Tabelle?

Aus Persistente Objekte und eigene Tabellen:

Wählen Sie eine Inhaltsklasse, wennWählen Sie eine Tabelle, wenn
Redakteure die Daten in der Administrationsoberfläche anlegen und bearbeitennur Code sie schreibt
Versionen, Übersetzungen und Berechtigungen pro Eintrag nötig sindnichts davon benötigt wird
die Daten als Seiten erscheinenes sich um interne Daten handelt
die Datenmengen moderat sindes Millionen von Zeilen oder viele Schreibvorgänge pro Sekunde gibt

Ein Modell

<?php
class expDemoItem extends eZPersistentObject
{
    public static function definition()
    {
        return array(
            'fields' => array(
                'id'      => array( 'name' => 'ID', 'datatype' => 'integer', 'default' => 0, 'required' => true ),
                'user_id' => array( 'name' => 'UserID', 'datatype' => 'integer', 'default' => 0, 'required' => true ),
                'title'   => array( 'name' => 'Title', 'datatype' => 'string', 'default' => '', 'required' => true ),
                'created' => array( 'name' => 'Created', 'datatype' => 'integer', 'default' => 0, 'required' => true ) ),
            'keys' => array( 'id' ),
            'increment_key' => 'id',
            'function_attributes' => array( 'user' => 'user' ),
            'class_name' => 'expDemoItem',
            'sort' => array( 'created' => 'desc' ),
            'name' => 'expdemo_item' );
    }

    public function user()
    {
        return eZUser::fetch( $this->attribute( 'user_id' ) );
    }
}

Das definition()-Array ist das Mapping (was Doctrine in Attribute oder XML schreibt und Eloquent aus der Tabelle ableitet): Felder mit Typen und Standardwerten, der Primärschlüssel, der Auto-Increment-Schlüssel, der Tabellenname und Funktionsattribute, also berechnete Eigenschaften, die Templates als $item.user.login lesen können.

Lesen und Schreiben

$item  = eZPersistentObject::fetchObject( expDemoItem::definition(), null, array( 'id' => (int)$id ) );
$items = eZPersistentObject::fetchObjectList( expDemoItem::definition(), null,
                                              array( 'user_id' => (int)$userID ),
                                              array( 'created' => 'desc' ),
                                              array( 'offset' => 0, 'length' => 20 ) );
$count = eZPersistentObject::count( expDemoItem::definition(), array( 'user_id' => (int)$userID ) );

$item = new expDemoItem( array( 'user_id' => $userID, 'title' => $title, 'created' => time() ) );
$item->store();                     // insert; the id is set from increment_key
$item->setAttribute( 'title', $newTitle );
$item->store();                     // update
$item->remove();                    // delete

Bedingungen sind Arrays, niemals SQL-Strings, und die Werte werden für Sie maskiert. Die meisten Projekte ergänzen statische Hilfsmethoden wie expDemoItem::fetch( $id ) und expDemoItem::fetchByUser( $userID ), so wie es die Klassen des Kernels tun.

Relationen

Es gibt keine deklarierten Relationen (hasMany, ManyToOne, ForeignKey) und keine Lazy-Loading-Proxys. Schreiben Sie die Methode selbst, wie user() oben, und stellen Sie sie über function_attributes bereit, wenn Templates sie benötigen. Für Many-to-many-Daten modellieren Sie die Verknüpfungstabelle als eigenes persistentes Objekt. Inhalte haben eigene Relationen (Objektrelationen und den Baum), die Sie über die Inhalts-API lesen.

Transaktionen

$db = eZDB::instance();
$db->begin();
// several store() and remove() calls
$db->commit();

Verschachtelte begin()-Aufrufe werden gezählt; nur das äußerste commit() schreibt die Transaktion fest (Datenbankzugriff und SQL). Halten Sie niemals eine Transaktion um einen langsamen entfernten Aufruf herum offen.

Im Vergleich mit vollständigen ORMs

FunktionEloquent / Doctrine / Django-ORM / ActiveRecordeZPersistentObject
MappingKonventionen, Attribute, Metadatendas definition()-Array
Abfragen erstellenfluente Query Builder, DQL, QuerysetsBedingungs-Arrays, Sortierungen und Limits; für alles Weitere SQL über eZDB (Abfragen)
Relationen, Eager LoadingdeklariertMethoden, die Sie selbst schreiben
Unit of Work, Identity MapDoctrinenein: jedes store() schreibt sofort
Migrationen aus dem ModellDoctrine, Django, Railsnein: .dba-Schemadateien (Migrationen)
Datenbank-Portabilitätjaja: SQLite, PostgreSQL, MySQL/MariaDB, Oracle sowie MongoDB über den Treiber des Kernels
Zugriff aus Templatesüber View-Modelseingebaut: Felder und Funktionsattribute sind in Templates lesbar

Sie können weiterhin eine Composer-Bibliothek in Ihrer Erweiterung verwenden (der Autoloader von Composer wird von autoload.php geladen), aber ein zweites ORM bedeutet eine zweite Verbindung, und Inhalte müssen trotzdem über die Inhalts-API geschrieben werden, damit Versionen, Caches, Berechtigungen und Suche konsistent bleiben.

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x