---
title: "Vorschläge für neuen DB-Wrapper"
url: "https://www.typo3.net/d/75350-vorschlaege-fuer-neuen-db-wrapper"
source: "typo3.net"
tags: ["Extensions","Entwicklung","Datenbank","Diskussion","PHP"]
created: "2008-03-28"
last_reply: "2008-03-28"
replies: 2
solved: false
page: 1
pages: 1
lang: "de"
---

# Vorschläge für neuen DB-Wrapper

Extensions › Entwicklung · 2 Antworten · gestartet 2008-03-28

## Eröffnungsbeitrag

**dyne** · 2008-03-28 · [Beitrag #1](https://www.typo3.net/d/75350-vorschlaege-fuer-neuen-db-wrapper/1)

Hi, ich würde gerne ein paar Meinungen, Anregungen und Vorschläge für eine neue Extension sammeln.

Es geht um einen neuen Datenbank-Wrapper der komfortabler sein soll, als alle bisher existenten und zugleich hohe Kompatibilität zu bestehenden Ansätzen bietet.

Es gibt also zwei Themen zu klären:

**1. Funktionalität:**

Ich habe ein paar neuartige Ansätze (glaube ich zumindest), die ich gleich einmal vorstellen möchte. Hierzu interessiert mich besonders eure Meinung. Natürlich sind auch eigene Vorschläge zur Funtkionalität willkommen.

**2. Kompatibilität:**

Gibt es ein bestimmtes Entwurfsmuster (also eine bestehende Klasse als Vorlage oder ein Interface) das implementiert werden sollte? Welche Eigenschaften und Methoden sind unerlässlich um Kompatibilität zu gewährleisten? Es geht mir vor allem um die Namen der Eigenschaften und Methoden.

**So hier mein versprochener (hoffentlich) neuartiger Ansatz:**

Gehe aus von einer DB-Tabelle:

```html
tx_myext_items: uid, tstamp, crdate, cruser_id, name, description, user_id
```

Man beachte, dass sich cruser_id üblicherweise auf einen BE-User bezieht und user_id sich in diesem Fall auf einen FE-User beziehen soll (also in Relation zur Tabelle fe_users steht.

Mein Gedanke war, wenn ich jetzt einen Datensatz aus dieser Extension-Tabelle abfrage interessieren mich womöglich weitere Informationen über den FE-User, wie dessen 'username'. Statt in einer zweiten Abfrage fe_users abzufragen, soll das durch den Wrapper automatisch erledigt werden, so dass eine Abfrage an die Tabelle z.B. so einen Datensatz zurückliefert:

```html
/* Reale Felder */
uid: 1,
tstamp: 1206433663,
crdate: 1206433663,
cruser_id: 4,
name: TestItem,
description: Lorem ipsum,
user_id = 2,
/* Virtuelle Felder */
user_uid = 2,
user_username = Mustermann,
user_usergroup = 3,8,9,
user_email = max@example.com
```

Einen solchen Wrapper (mit noch weiterer ähnlicher) Funktionalität habe ich bereits geschrieben und er lässt sich schnell an verschiedene Datenbankstrukturen anpassen. Er benutzt aber leider keine mit anderen Wrappern kompatiblen Methoden. Der Wrapper findet sich im TER unter dem Namen 'dbhandler', falls sich das jemand näher ansehen möchte.

So, ich bin gespannt auf eure Meinungen.

So long,
Sebastian

## Antworten

### [#2](https://www.typo3.net/d/75350-vorschlaege-fuer-neuen-db-wrapper/2) · just2b · 2008-03-28

Hallo Sebastian,

ich sehe den Vorteil noch nicht ganz, den ich habe wenn ich mir das nicht ohnedies selber mit einer Funktion getUser($uid) bastle, die mir dann auch nur die Felder vom User zurückgibt, die ich brauche.

Alles in einem Set zu haben ist vielleicht auch manchmal gar nicht so der Vorteil wenn ich die Userdaten in einem anderen Bereich ausgeben lassen will usw.

Georg

### [#3](https://www.typo3.net/d/75350-vorschlaege-fuer-neuen-db-wrapper/3) · dyne · 2008-03-28

Ich habe meine Idee vielleicht etwas zu knapp beschrieben.

Also auf die Idee gekommen bin ich weil ich es leid war bei jeder Extension Methoden wie getUserName($id), getUserIdByName($name), getItemDescription($id) usw zu schreiben.

Die Anfragen im Wrapper lassen sich in 3 Modi ausführen:
**normal:** Die zurückgegebenen Datensätze enthalten alle Felder, die die Tabelle besitzt. (Entspricht einer "SELECT * ..."-Abfrage)
**joined:** Die zurückgegebenen Datensätze enthalten alle Felder, die die Tabelle besitzt und zusätzlich jeweils ein beschreibendes Feld ("label") aus jedem referenzierten Datensatz. Z.B. wird beim Feld user_id die "fe_users"-Tabelle abgefragt und ein Feld ("username") was den Datensatz signifikant beschreibt geholt.
**complete:** Wie "joined" nur dass aus den referenzierten Datensätzen nicht ein, sondern alle Felder abgefragt und zurückgegeben werden.

So lassen sich so viele Informationen abfragen wie nötig.
Leider funktioniert das Modell bisher nur bei 1:n-Beziehungen. m:m habe ich bisher nicht implementiert.

Natürlich muss zugewiesen werden, welches Feld einer Tabelle dessen "label" ist und außerdem muss deklariert werden, dass mit "user_id" die Tabelle "fe_users" gemeint ist. Das habe ich (finde ich) sehr komfortabel gelöst:

Hier ein Beispielcode zu Verwendung meines bisherigen Wrappers:

```php
$db = new dbhandler();
$db->set_table_alias(
    'fe_users',    // Die benutzte DB-Tabelle

    'user',        // Das erzeugte Alias der Tabelle. Mit dem (meistens 
                   // kürzeren) Alias lässt sich die Tabelle im Folgenen
                   // ansprechen. Außerdem bedeutet diese Zuweisung, dass Felder
                   // mit dem Namen 'user_id' dieser Tabelle zugeordnet werden.

    'username'     // Der letzte Parameter ist optional. Standartmäßig wird 
                   // davon ausgegangen, dass jede Tabelle das Feld 'name' 
                   // besitzt, was dann als "label" verwendet wird. Ist dem 
                   // nicht so, wird hier ein alternatives "label" angegeben
);
$db->set_table_alias('tx_myext_items', 'item');
echo 'Die Tabelle hat '.$db->count_rows('item', 'deleted=0 AND hidden=0').' Datensätze.<br />'.
$array = $db->fetch_row(
    'item',        // Die Tabelle wird über ihr Alias angesprochen, das ist 
                   // kürzer und übersichtlich

    2,             // fetch_row() soll nur einen Datensatz liefern und erwartet
                   // die ID des Datensatzes

    'complete'     // Optional: Der Modus. In diesem Fall werden alle 
                   // verfügbaren "virtuellen" Felder geliefert. Also alle 
                   // Felder der referenzierten Datensätze. Standart: 'normal'
);
print_r($array);
$array = $db->fetch_row('item', 2, 'joined');
print_r($array);
```

Ausgabe könnte sein:
Die Tabelle hat 7 Datensätze.
Array(
    [uid] => 2,
    [tstamp] => 1204635429,
    [crdate] => 1204635429,
    [cruser_id] => 4,
    [name] => TestItem,
    [description] => Lorem Ipsum,
    [user_id] => 2,
    [user_uid] => 2,
    [user_pid] => 9,
    [user_tstamp] => 1206495781,
    [user_username] => Max,
    [user_password] => geheim,
    [user_usergroup] => 3,8,9,
    [user_disable] => 0,
[usw..]
)
Array(
    [uid] => 2,
    [tstamp] => 1204635429,
    [crdate] => 1204635429,
    [cruser_id] => 4,
    [name] => TestItem,
    [description] => Lorem Ipsum,
    [user_id] => 2,
    [user_username] => Max
)

Anmerkung: Zu cruser_id wurden keine weiteren Daten abgefragt, da kein Alias mit dem Namen "cruser" angelegt worden ist. Die Anweisung müsste lauten:

```php
$db->set_table_alias('be_users', 'cruser', 'username');
```

Es lassen sich auch auf einzelne reale oder virtuelle Felder eines Datensatzes zugreifen:

```php
// Reales Feld "name"
$item = $db->fetch_field('item', 2, 'name');
// Virtuelles Feld "user_username" aus der Tabelle fe_users
$user = $db->fetch_field('item', 2, 'user_username');
echo "$item gehört $user";
```

Ausgabe:
TestItem gehört Max

---

Quelle: „Vorschläge für neuen DB-Wrapper“, typo3.net, https://www.typo3.net/d/75350-vorschlaege-fuer-neuen-db-wrapper
Beiträge von Mitgliedern des Forums. Bitte mit Link auf die Diskussion zitieren.
