PHP: Redbean ORM

Redbean ist ein ORM für PHP.
Ein ORM (Objekt-Relationaler Mapper) bildet Objekte in Relationalen Datenbanken ab.
Dies ist in so weit praktisch, dass man bei der Programmierung Objekte mit Eigenschaften verwenden kann und sich nicht darum kümmern muss wie die

Daten in die Datenbank gespeichert, geändert oder gelesen werden müssen.
Weiterhin geafllt mir speziell an redbean, dass:
* alles in einer php datei steckt (rb.php)
* es die Datenbnak-Struktur automatisch anpasst
* es SQLite / MySQL / PostgreSQL ohne Code-Änderung via PDO ansprechen kann

Nach dem man die tar.gz herunter geladen und asugepackt hat, kann man die darin enthaltene rb.php in das gewünschte verzeichnis mit dem PHP-Code
legen.

Nach einem Include der rb.php kann man direkt mit den Einstellungen der Datenbank beginnen.
Ich benutze aus persönlichen Gründen hier mal eine SQLite-Datenbank.

1
2
3
4
5
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
?>

Damit sagen wir redbean, dass es im selben verzeichnis eine Datei „database.db3“ als SQLite Datenbnak benutzen soll.
Ruft man diese Datei jetzt auf (ich nenne Sie einfach mal „rbtest.php“), wird bereits die angegebene SQLite-DB erstellt.

Als nächstes wollen wir einfach mal ein Objekt anlegen.
Wie im Beispiel auf der Redbean-Seite werd eich hier auch ein Buch nehmen.

1
2
3
4
5
6
7
8
9
10
11
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
// Datensatz anlegen
$book = R::dispense("book");
$book->title = "Buch1";
$id = R::store($book);
echo $id;
 
?>

Dispense gibt den Objekt-Typ an, und mit der title Eigenschaft setzen wir den Titel des Buchs.
Danach wird das Buch-Objekt gespeichert. Als Rückgabewert bekommen wir die ID des Datensatzes zurück.

Rufen wir die rbtest.php wieder im Browser auf, bekommen wir als ausgabe jetzt eine „1“ – für die erste ID.
Um das zu überprüfen, rufen wir die Seite erneut im browser auf – jetzt wird eine „2“ ausgegeben.
Zusätzlich kann man sehen, dass die SQLite-DB im Verzeichnis an Größe gewonnen hat (von 0kb auf 3kb).
Was ist nun passiert?
Redbean hat beim speichern des Objektes gleich die Struktur der Tabelle mit angelegt.
Damit erspart man sich das erstellen der Tabellenstruktur in der Datenbank komplett.

Schauen wir uns das ganze in der Datenbnak mal an:

SELECT name from sqlite_master

RecNo name            
----- --------------- 
    1 book            
    2 sqlite_sequence 

Da wir ein Objekt vom Typ „book“ angelegt haben, gibt es auch eine Tabelle in der Datenbank mit dem selben Namen.
Wenn wir jetzt in die Tabelle „book“ schauen, sollten wir 2 Datensätze angezeigt bekommen.

SELECT * FROM book

RecNo id title 
----- -- ----- 
    1  1 Buch1 
    2  2 Buch1 

Da wir unsere rbtest.php 2 mal aufgerufen haben, haben wir das selbe Objekt 2 mal in der DB.
Jetzt würde es Sinn machen den Titel vom zweiten Buch zu ändern, was wir nun auch tun wollen.

1
2
3
4
5
6
7
8
9
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
$book = R::load( "book", 2 );
$book->title = "Buch2";
R::store($book);
 
?>

Und in der DB haben wir folgendes ergebnis:

SELECT * FROM book

RecNo id title 
----- -- ----- 
    1  1 Buch1 
    2  2 Buch2 

Jetzt wollen wir aber nicht nur Objekte speichern und ändern, sondern vielleicht auch weitere Eigenschaften in einem Objekt verwenden.
Wenn wir eigenschaften in einem Objekt hinzufügen, muss die Struktur der Tabelle in der Datenbank dementsprechend mit geändert werden.
Hierzu wollen wir unserem Buch-objekt noch 2 weitere Eigenschaften (Autor und Preis) geben.

1
2
3
4
5
6
7
8
9
10
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
$book = R::load( "book", 2 );
$book->autor = "Sven";
$book->preis = 19.95;
R::store($book);
 
?>

Damit habe ich mir das Buch mit der ID 2 genommen und um die 2 Eugenschaften erweitert.
Nach dem Aufrufen der rbtest.php im browser sieht der Tabellen-Inhalt nun wie folgt aus:

SELECT * FROM book

RecNo id title autor   preis 
----- -- ----- ------ ------ 
    1  1 Buch1 (null) (null) 
    2  2 Buch2 Sven    19.95 

Damit hat redbean von sich aus die Struktur der Tabelle entsprechend der Struktur des Objektes geändert und für den 2. Datensatz den Inhalt der

Spalten entsprechend dem Inhalt der Eigenschaften des Buch-Objektes besetzt.

Ab und an kommt es vor, da möchte man sich den inhalt der Tabelle auch in der Webseite anzeigen lassen.
Hierfür gibt es die Funktion „find“, mit der man Datensätze suchen und z.B. in einer foreach Schleife durch gehen kann.
Hier ein Beipspiel um alle Datensätze der Tabelle, bzw Objekte aufzulisten (ID>0):

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
// Datensätze auflisten
$books = R::find("book", " id > 0 "); 
foreach($books as $book) 
{
	echo "ID: ".$book->id." / Titel: ".$book->title."<br>";
}
 
?>

Nach dem Aufrufen bekommt man folgendes angezeigt:

ID: 1 / Titel: Buch1
ID: 2 / Titel: Buch2

Jetzt möchte man aber eventuell platzhalter in dem Suchstring verwenden um z.b. nicht auf Datentypen achten zu müssen bzw Zahlen erst in Strings

umzuwandeln oder anders herum.
Hierfür kann man platzhalter in Form eines Fragezeichens Benutzen und als 2. Parameter ein Array übergeben.
Das ganze könnte dann z.B. so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
// Datensätze auflisten
$books = R::find("book","id>? and title LIKE ? ",array(0,"Buch%"));
foreach($books as $book) 
{
	echo "ID: ".$book->id." / Titel: ".$book->title."<br>";
}
 
?>

Ich habe gleich noch ein LIKE mit eingebaut um zu demonstrieren das dieses ebenfalls funktioniert.
Als Ausgabe der Seite bekommen wir das selbe ergebnis wie oben auch (werden ja auch die selben Datensätze selektiert).

Manchmal möchte man auch nur einen Datensatz haben – und diesen nicht erst in einer Schleife durch gehen, da dies bei einem Datensatz nur wenig

Sinn macht.
Hierfür stellt redbean eine funktion mit dem Namen „findOne“ bereit, welche identisch zur eben gezeigten find Funktion arbeitet.

1
2
3
4
5
6
7
8
9
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
// Datensätze auflisten
$book = R::findOne("book","id=? and title=? ",array(2,"Buch2"));
echo "ID: ".$book->id." / Titel: ".$book->title."<br>";
 
?>

Im Unterschied zu der find-Funktion bekommen wir hier gleich ein Objekt vom Typ „book“ zurück, welches wir dann auch direkt ansprechen können.
Da ich hier das 2. buch gesucht habe, bekomme ich dieses auch angezeigt:

ID: 2 / Titel: Buch2

Als letztes möchte ich ein Objekt löschen.
Da das erste Objekt unvollständig ist, möchte ich dieses hier aus der Tabelle löschen.
Zum löschen von Objekten gibt es die Funktion „trash“ mit wlecher wir diesn Code bauen:

1
2
3
4
5
6
7
8
9
<?php 
require("rb.php");
R::setup("sqlite:database.db3"); 
 
// Datensatz Löschen
$book = R::load( "book", 1 );
R::trash( $book ); 
 
?>

Nach dem Aufruf der Seite sieht der Inhalt der Tabelle so aus, dass nur noch der 2. Datensatz existiert

RecNo id title autor preis 
----- -- ----- ----- ----- 
    1  2 Buch2 Sven  19.95 

Ja… Das sollte es für die Einführung in Redbean sein.
Den Rest der vielen Tollen funktionen, kann man sich ziemlich gut mit beispielen auf der Redbean-Seite anschauen 🙂

leave your comment


*

Unterstütze den Frickelblog!