Abfragen: Inhalts-Fetches, eZDB und SQL
Diese Seite richtet sich an Entwickler, die zu einem Query Builder greifen ($qb->where(), Model::where(),
Querysets, Arel). Der Kernel hat keinen allgemeinen Query Builder. Sie fragen Daten je nach Art auf eine von drei
Weisen ab.
Inhalt
- Welcher Weg für welche Daten
- Inhalte: Fetch-Parameter
- Ihre Tabellen: Bedingungs-Arrays
- Ihre Tabellen: SQL über eZDB
- Portabilität
- Performance
Welcher Weg für welche Daten
| Daten | Weg | Ergebnis |
|---|---|---|
| Inhalte (Knoten, Objekte) | eZContentObjectTreeNode::subTreeByNodeID() und im Template fetch( 'content', 'list', ... ) | angewendete Berechtigungen, Sprachbehandlung, Sortierung nach Attribut |
| Ihre persistenten Objekte | eZPersistentObject::fetchObjectList() mit Bedingungen | Objekte, Maskierung, jede Datenbank-Engine |
| Berichte, Joins, Aggregate auf Ihren Tabellen | eZDB::instance()->arrayQuery() | Zeilen als Arrays |
| Volltextsuche über Inhalte | die Suchmaschine (eingebaut oder Solr über ezfind) | Relevanz, Facetten mit Solr (Website-Suche) |
Inhalte: Fetch-Parameter
$nodes = eZContentObjectTreeNode::subTreeByNodeID( array(
'ClassFilterType' => 'include',
'ClassFilterArray' => array( 'event' ),
'AttributeFilter' => array( array( 'event/start_date', '>=', time() ) ),
'SortBy' => array( array( 'attribute', true, 'event/start_date' ) ),
'Depth' => 3,
'Limit' => 20,
'Offset' => 0 ), $parentNodeID );Das Parameter-Array ist der Query Builder für Inhalte: Klassenfilter, Attributfilter, Tiefe, Sortierung, Limit und
Offset. Die content/read-Richtlinie des aktuellen Benutzers wird angewendet, es sei denn, Sie übergeben
'Limitation' => array() – was Sie in Code, der Benutzern Ergebnisse anzeigt, niemals tun dürfen
(Die Inhalts-API). Templates verwenden dieselben Parameter
in Kleinschreibung über fetch( 'content', 'list', hash( ... ) )
(Fetch-Funktionen).
Ihre Tabellen: Bedingungs-Arrays
$items = eZPersistentObject::fetchObjectList( expDemoItem::definition(), null,
array( 'user_id' => (int)$userID ),
array( 'created' => 'desc' ),
array( 'offset' => 0, 'length' => 20 ) );Bedingungen sind Arrays; die Werte werden für Sie maskiert (ORM: eZPersistentObject).
Ihre Tabellen: SQL über eZDB
$db = eZDB::instance();
$rows = $db->arrayQuery( 'SELECT id, title FROM expdemo_item WHERE user_id = ' . (int)$userID . ' ORDER BY created DESC',
array( 'offset' => 0, 'limit' => 20 ) );
$db->query( "UPDATE expdemo_item SET title = '" . $db->escapeString( $title ) . "' WHERE id = " . (int)$id );arrayQuery() und query() erwarten einen fertigen SQL-String, kein Statement mit Platzhaltern wie bei PDO: Casten
Sie Ganzzahlen, umschließen Sie Strings mit escapeString() und wählen Sie Bezeichner aus einer Allow-List.
query() gibt bei datenändernden Statements true oder false zurück.
Portabilität
Der Treiber wird über site.ini [DatabaseSettings] DatabaseImplementation gewählt; der Kernel liefert Treiber für
MySQL/MariaDB (eZMySQLiDB), PostgreSQL, SQLite (eZSQLite3DB) und MongoDB (expMongoDB) mit, Oracle kommt über
die Erweiterung ezoracle (Datenbankunterstützung). Damit Ihr SQL auf allen funktioniert:
- Verwenden Sie Offsets und Limits von
arrayQuery(), nichtLIMITim String. - Vermeiden Sie Engine-spezifische Funktionen wie
IFNULL,GROUP_CONCAToderSET @var := .... - MongoDB kennt keine Joins: Der Treiber übersetzt gängige Statements; für Ihre eigenen Tabellen sollten Sie
eZPersistentObjectbevorzugen. - Testen Sie auf SQLite (Standard für neue Installationen) und auf der Produktions-Engine.
Performance
- Begrenzen Sie Listen immer; zählen Sie mit
subTreeCountByNodeID()odereZPersistentObject::count(). - Holen Sie Daten in langen Skripten seitenweise und leeren Sie dazwischen die In-Memory-Caches (
eZContentObject::clearCache()). - Der SQL-Query-Cache kann Leseergebnisse vorhalten (
querycache.ini) (SQL-Query-Cache). - Die Debug-Leiste zeigt die Abfragen einer Seite und ihre Dauer (Debugging).
Verwandte Seiten
- Datenbankzugriff und SQL
- Datenbanken
- Profiling und Performance
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
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.