Verwenden Sie Illuminate Database mit Eloquent in Ihrer PHP-App ohne Laravel

Illuminate ist die Datenbank-Engine von Laravel minus Laravel. Es wird zusammen mit dem Eloquent ORM in Laravel geliefert. Wenn Sie Ihre PHP-Apps mit ORMs erstellen möchten und Laravel nicht verwenden möchten, ist dieses Tutorial genau das Richtige für Sie.

In diesem Lernprogramm werden wir das Backend für eine F & A-App mit PHP, Illuminate Database und Eloquent ORM erstellen.

Projektabhängigkeiten 

  1. PHP: 5.5+
  2. MYSQL
  3. Komponist

App-Funktionen

Unsere App wird zehn Aufgaben erledigen:

  • Einen Benutzer hinzufügen.
  • Frage hinzufügen.
  • Fügen Sie einer Frage eine Antwort hinzu. 
  • Antwortete positiv.
  • Erhalten Sie eine Frage mit Antworten.
  • Holen Sie sich alle Fragen und Benutzer, die sie gestellt haben.
  • Holen Sie sich spezielle Fragen, Antworten und Upvotes.
  • Zählen Sie die Fragen eines bestimmten Benutzers.
  • Antwort nach Benutzer aktualisieren.
  • Frage löschen.

Zuerst erstellen wir unser Projektverzeichnis und die Struktur.

Im Hauptprojektverzeichnis erstellen wir eine App Ordner und dann in diesem App-Ordner erstellen wir zwei Ordner:Modelle und Steuerungen. In diesem Bild heißt unser Hauptprojektordner eloquent. Sie sollten es durch einen beliebigen Namen ersetzen.

Als Nächstes erstellen wir eine index.php Datei im Hauptprojektordner auf derselben Ebene wie die App Mappe.

Wir werden git verwenden, also erstellen wir eine .gitignore-Datei. Beachten Sie, dass dieser Schritt optional ist.

Als Nächstes installieren wir die Abhängigkeiten, die für dieses Projekt erforderlich sind. Im Hauptordner des Projekts erstellen wir eine composer.json-Datei. Dann fügen Sie diese in unsere composer.json-Datei ein.

"Name": "illuminate-example / eloquent", "description": "Implementierung von Datenbankabfragen mit illuminate und eloquent", "type": "project", "requir": 

Um die Illuminate-Datenbank zu installieren, fügen wir dies unserer composer.json hinzu:
"Beleuchten / Datenbank": "5.1.8",.

Als Nächstes fügen wir das psr-4-Autoloading für unsere Modelle und Controller hinzu:

"Autoload": "psr-4": "Controller \\": "App / Controller /", "Models \\": "App / Models /"

Nun sollte unsere composer.json-Datei so aussehen:

"Name": "illuminate-example / eloquent", "description": "Implementierung von Datenbankabfragen mit illuminate und eloquent", "type": "project", "required": "illuminate / database": "5.1. 8 "," autoload ": " psr-4 ": " Controller \\ ":" app / controller / "," Models \\ ":" app / models / " 

Wir werden nun diese beiden Composer-Befehle am selben Ort wie unsere Composer.json-Datei ausführen:

composer install composer dump-autoload -o

Dies erzeugt einen Lieferantenordner, den wir zu gitignore hinzufügen können (dies ist ebenfalls ein optionaler Schritt)..

Fügen wir eine Konfigurationsdatei für unsere Datenbankanmeldeinformationen hinzu.

Im Hauptverzeichnis des Projekts erstellen wir eine Datei mit dem Namen config.php und definieren DB-Details in der Datei Config.php. Beachten Sie, dass die Werte durch Ihre eigenen Verbindungsdetails ersetzt werden sollten.

Als Nächstes erstellen wir das Schema für unsere App.

Bevor wir das Schema für die Tabellen in unserer Datenbank erstellen, ist zu beachten, dass wir unserem Schema Zeitstempel hinzufügen können.

Der Eloquent-ORM erwartet zwei Zeitstempelsäulen, wenn wir die Zeitstempeloperation für eine bestimmte Tabelle / ein bestimmtes Modell aktivieren möchten. Sie sind die hergestellt in und aktualisiert am Säulen. Wenn wir Zeitstempel für ein Modell aktivieren, aktualisiert Eloquent diese Felder automatisch mit der Zeit, zu der wir einen Datensatz erstellen oder aktualisieren.

Es gibt eine dritte Spalte deleted_at. Das deleted_at Zeitstempel funktionieren jedoch anders. Eloquent verfügt über eine Soft-Delete-Funktion, die die deleted_at Spalte, um festzustellen, ob ein Datensatz gelöscht wurde. Wenn Sie einen Datensatz mit der eloquenten 'delete'-Funktion löschen und Soft-Delete aktivieren, wird die Spalte mit dem Löschzeitpunkt aktualisiert. Diese gelöschten Elemente können dann jederzeit abgerufen werden.

In dieser App werden wir die Zeitstempel nutzen, also werden wir alle drei bei der Schema-Erstellung verwenden.

Erstellen Sie Tabellen mit den folgenden Befehlen in MySQL:

Fragen

CREATE TABLE 'fragen' ('id' int (11) vorzeichenlos NOT NULL AUTO_INCREMENT, 'question' tinytext, 'user_id' int (11) DEFAULT NULL, 'Created_at' Zeitstempel NULL DEFAULT NULL, 'Updated_at' Zeitstempel NULL DEFAULT NULL, ' deleted_at 'timestamp NULL DEFAULT NULL, PRIMARY KEY (' id ')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Antworten

CREATE TABLE 'answers' ('id' int (11) vorzeichenlos NOT NULL AUTO_INCREMENT, 'answer' tinytext, 'user_id' int (11) DEFAULT NULL, 'frage_id' int (11) DEFAULT NULL, 'create_at' timestamp NULL DEFAULT NULL , 'update_at' Zeitstempel NULL DEFAULT NULL, 'deleted_at' Zeitstempel NULL DEFAULT NULL, PRIMARY KEY ('id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Upvotes

CREATE TABLE 'upvotes' ('id' int (11) vorzeichenlos NOT NULL AUTO_INCREMENT, 'answer_id' int (11) DEFAULT NULL, 'user_id' int (11) DEFAULT NULL, 'create_at' Zeitstempel NULL DEFAULT NULL, 'aktualisierten_ Zeitstempel' NULL DEFAULT NULL, Zeitstempel 'deleted_at' NULL DEFAULT NULL, PRIMARY KEY ('id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Benutzer

CREATE TABLE 'users' ('id' int (11) ohne Vorzeichen NOT NULL AUTO_INCREMENT, 'username' varchar (100) DEFAULT NULL, 'email' varchar (200) DEFAULT NULL, 'password' varchar (200) DEFAULT NULL, 'created_at.) 'Zeitstempel NULL DEFAULT NULL,' update_at 'Zeitstempel NULL DEFAULT NULL,' deleted_at 'Zeitstempel NULL DEFAULT NULL, PRIMARY KEY (' id ')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Wir werden fortfahren, indem wir Dateien für Modelle und Controller für unsere Tabellen an den folgenden Speicherorten erstellen:

  • Projektordner / app / models / question.php
  • Projektordner / app / models / answer.php
  • Projektordner / app / models / upvote.php
  • Projektordner / app / models / user.php
  • Projektordner / app / models / database.php
  • Projektordner / app / controller / questions.php
  • Projektordner / app / controller / answers.php
  • Projektordner / app / controller / upvotes.php
  • Projektordner / app / controller / users.php

Öffnen models / database.php mit einem Editor.

Zuerst erstellen wir die Kapsel:

addConnection (['driver' => DBDRIVER, 'host' => DBHOST, 'database' => DBNAME, 'username' => DBUSER, 'password' => DBPASS, 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => ",]); // Richten Sie das eloquent ORM… ein. $ capsule-> bootEloquent ();

In der obigen Datei initialisieren und konfigurieren Sie die Kapsel mit den in config.php definierten Konstanten und booten dann eloquent.

Im nächsten Schritt erstellen Sie ein Startskript. Dies ist eine Datei, in der alles ausgeführt wird, bevor unsere App funktioniert.

Wir erstellen eine Startdatei am Ort Projektordner / start.php, und dann in der Datei die Composer-Autoload-Datei erforderlich:

erfordern 'vendor / autoload.php';

Danach verlangen wir config.php um die Berechtigungsnachweise zu erhalten: erfordern 'config.php';

Dann initialisieren wir die Datenbankklasse.

Ihre start.php sollte so aussehen:

Fügen Sie start.php in Ihre index.php ein, da dies unsere Hauptdatei sein wird.

Unsere index.php-Datei sieht jetzt so aus:

 

Als nächstes können wir an unseren Steuerungen und Modellen arbeiten. Im Projektordner/ app /models / frage.php, wir fügen das hinzu:

Dann in Projektordner/app/controllers/questions.php:

Im Projektordner/app/controllers/answers.php, wir machen das gleiche:

Schritt 1: Fügen Sie einen Benutzer hinzu

Im Benutzermodell (Projektordner/app/models/user.php), Wir fügen den folgenden Code hinzu, um unseren Namespace zu definieren, das Eloquent-Modell zu erweitern und den Tabellennamen zu definieren (geschützte $ table) und welche Felder in den Tabellen durch Massenerzeugung gefüllt werden können (geschützt $ ausfüllbar).

In der Benutzersteuerung (Projektordner/app/controllers/user.php) definieren wir unseren Namespace und unsere Klasse wie gewohnt:

Um anschließend einen Benutzer zu erstellen, importieren wir im Benutzer-Controller den Namespace des Benutzermodells, Benutze Models \ User;, und fügen Sie dann eine Funktion hinzu, um den Benutzer zu erstellen.

$ username, 'email' => $ email, 'password' => $ password]); $ Benutzer zurückgeben; 

Unser User Controller sieht jetzt so aus.

$ username, 'email' => $ email, 'password' => $ password]); $ Benutzer zurückgeben; ?>

In index.php fügen wir diese Zeilen hinzu und führen die App aus, um einen neuen Benutzer zu erstellen.

Schritt 2: Fügen Sie eine Frage hinzu

Um eine Frage hinzuzufügen, importieren wir den Fragenmodell-Namensraum in den Fragencontroller und schreiben ein create_question Funktion:

Modelle verwenden \ Frage;

Dann:

$ question, 'user_id' => $ user_id]); $ Frage zurückgeben;  

Wir haben Eloquent-Modelle zur Massenerstellung verwendet, um diesen Datensatz einzufügen. Bevor dies funktioniert, müssen wir jedoch zulassen, dass diese Felder ausgefüllt werden können, da Eloquent-Modelle standardmäßig die Massenerstellung verhindern.

Also gehen wir zum Frage modellieren und das hinzufügen geschützt $ ausfüllbar Eigenschaft an die Klasse.

protected $ fillable = ['Frage', 'Benutzer-ID'];

Um dies auszuführen, importieren Sie den Fragen-Controller in index.php und rufen Sie die create_question Funktion statisch:

Controller verwenden \ Question;

Dann erstellen Sie eine Frage mit einer Frage und einer Benutzer-ID als Parameter:

$ question = Questions :: create_question ("Haben Sie jemals Ihren Doppelgänger getroffen?", 1);

Bei Erfolg wird ein Modellobjekt zurückgegeben.

Wir führen jetzt das Skript index.php mit verschiedenen Einträgen aus, um der Datenbank weitere Fragen hinzuzufügen.

Schritt 3: Fügen Sie einer Frage eine Antwort hinzu 

Im Antwortmodell wiederholen wir die Schritte, die für Fragen- und Benutzermodelle ausgeführt wurden, indem Sie den folgenden Code hinzufügen:

Dann schreiben wir im Antwortcontroller diese Zeilen:

$ answer, 'question_id' => $ question_id, 'user_id' => $ user_id]); Rückgabe von $ answer; ?>

In index.php können wir dann eine Antwort für die Frage mit der zuvor hinzugefügten ID 1 mit der Benutzer-ID 2 erstellen. Vergessen Sie nicht, den Antwortcontroller zuerst in die index.php zu importieren.

Um mehrere Einträge zu verhindern, kommentieren Sie alle anderen Aufrufe in index.php, bevor Sie eine neue ausführen.

Schritt 4: Befürworte eine Antwort

Dies sind die gleichen Schritte, die wir gewohnt sind.

Wir werden dies also in das Upvote-Modell kopieren Projektordner/ app /models / upvote.php.

In den Antwortcontrollern importieren wir dann den Upvote Model-Namespace.

Benutze Models \ Upvote;

Dann erstellen wir eine upvote_answer Funktion.

$ answer_id, 'user_id' => $ user_id]); $ upvote zurückgeben; 

In index.php können wir die Funktion mit einer Dummy-Benutzer-ID aufrufen, um die Antwort mit der ID 1 zu bestätigen.

$ upvote = Answers :: upvote_answer (1,14); 

Schritt 5: Erhalten Sie eine Frage mit Antworten

Für solche Aufgaben können wir Eloquent-Beziehungen verwenden.

Zu den Beziehungsarten gehören eins zu eins, eins zu viele, viele zu vielen usw.

Bei der Verwendung dieser Beziehungen nimmt Eloquent einen Fremdschlüssel im Formular an Modellname_id existiert auf den Modellen. Für diese Aufgabe ist die Beziehung eine Eins-zu-Viele-Beziehung, da eine einzelne Frage eine beliebige Anzahl von Antworten besitzen kann.

Zuerst definieren wir diese Beziehung, indem wir diese Funktion unserem Fragenmodell hinzufügen.

hasMany ('\ Models \ Answer'); 

Dann schreiben wir im Fragencontroller eine Funktion, um Fragen mit Antworten zu erhalten.

get () -> toArray (); $ Fragen zurückgeben; 

Dadurch werden die Fragen mit den entsprechenden Antworten abgerufen.

In index.php kommentieren wir alle anderen Aufrufe und führen Folgendes aus:

$ all = Fragen :: get_questions_with_answers ();

Wir können var_dump oder print_r das $ alle Variable, um die Ergebnisse zu sehen.

Schritt 6: Holen Sie sich alle Fragen und Benutzer, die sie gefragt haben

Dies ist eine Eins-zu-Eins-Beziehung, da eine Frage einen Benutzer hat, also fügen wir sie dem Fragenmodell hinzu.

GearsTo ('\ Models \ User'); 

Dann erstellen wir eine Funktion im Fragencontroller und verwenden die mit Funktion auf dem Fragenmodell.

get () -> toArray (); $ Fragen zurückgeben; 

Kommentieren Sie in index.php alle anderen und führen Sie Folgendes aus:

$ all_with_users = Fragen :: get_questions_with_users ();

Schritt 7: Erhalten Sie eine Frage mit Antworten und Upvotes

Zuerst definieren wir eine Beziehung zwischen Antworten und Upvotes. Eine Antwort hat viele Upvotes, daher ist die Beziehung eins zu vielen.

Also fügen wir unserem Antwortmodell die folgende Funktion hinzu:

hasMany ('\ Models \ Upvote'); 

Dann erstellen wir im Fragencontroller die Funktion, um Folgendes zu erhalten:

Antworten () -> mit ('Upvotes') -> Get () -> ToArray (); $ Fragen zurückgeben; 

Wie in den vorherigen Schritten kommentieren wir alle anderen Aufrufe von index.php und führen Folgendes aus:

$ one_question = Fragen :: get_question_answers_upvotes (1);

Wir können das drucken $ one_question Variable, um die Ergebnisse zu sehen.

Schritt 8: Zählen Sie alle Fragen eines bestimmten Benutzers

Zuerst importieren wir das Fragenmodell in die Benutzersteuerungen:

Modelle verwenden \ Frage;

Dann schreiben wir diese Funktion:

Anzahl(); return $ count; 

In index.php kommentieren wir andere Aufrufe und fügen diese Zeile hinzu:

$ user_question_count = Benutzer :: question_count (1);

Dies gibt eine ganze Zahl zurück. Dies ist die Anzahl der Fragen, die von einem Benutzer mit der ID 1 hinzugefügt wurden. 

Wir können das drucken $ user_question_count Variable und führen Sie index.php aus, um die Ergebnisse anzuzeigen.

Schritt 9: Aktualisieren Sie die Antwort nach Benutzer

Das Konzept der Aktualisierung mit dem Eloquent ORM ist ziemlich einfach. Zuerst finden wir eine Platte, dann mutieren und speichern wir.

Jetzt fügen wir in den Antwortcontrollern diese Funktion hinzu:

Antwort = $ new_answer; $ updated = $ answer-> save (); $ zurückgeben; 

In index.php können wir alle anderen Anrufe kommentieren und die Antwort mit id 1 wie folgt aktualisieren:

$ update_answer = Antworten :: update_answer (1, "Dies ist eine aktualisierte Antwort");

Dies gibt einen booleschen Wert "true" zurück, wenn die Aktualisierung erfolgreich war.

Schritt 10: Eine Frage löschen (Soft Delete)

In dieser letzten Aufgabe implementieren wir Eloquent SoftDelete.

Zuerst teilen wir dem Fragemodell mit SoftDeletes durch das importieren der SoftDeletes Namespace und dann mit der SoftDeletes Merkmal in unserer Klasse.

benutze Illuminate \ Database \ Eloquent \ SoftDeletes;

Dann fügen wir nach der Klassendeklarationszeile diese Zeile hinzu:

Verwenden Sie SoftDeletes;

Dann fügen wir hinzu deleted_at zum Geschützte $ -Daten Eigenschaft für das Modell. Dies sind die erforderlichen Schritte. 

protected $ dates = ['deleted_at'];

Unser Fragemodell sieht jetzt so aus:

hasMany ('\ Models \ Answer');  public function user () return $ this-> likesTo ('\ Models \ User'); ?>

Dann schaffen wir das delete_question Funktion im Fragencontroller.

löschen(); $ zurückgeben;  

In index.php ausführen:

$ delete = Fragen :: delete_question (1);

Herzliche Glückwünsche! Sie haben gerade ein voll funktionsfähiges Backend mit Illuminate und Eloquent gebaut. Und dazu mussten wir nicht so viel Code schreiben.

Den Code für dieses Tutorial finden Sie auf GitHub. 

Fazit

Illuminate wird auch mit dem Query Builder geliefert, den Sie für noch komplexere Datenbankabfragen verwenden können, und ist definitiv etwas, mit dem Sie experimentieren und in Ihrer App verwenden möchten.

Das einzige, was in der eigenständigen Illuminate-Datenbank fehlt, sind Datenbankmigrationen, die ein reizvolles Merkmal von Laravel sind, und Lumen, das Microframework von Laravel. Sie sollten in Ihren Apps beide verwenden, um die nützlichen Funktionen zu nutzen, mit denen sie ausgestattet sind.

Weitere Informationen zu Eloquent finden Sie auf der Seite zur offiziellen Eloquent-Dokumentation.

Verweise

  • Illuminate Database auf GitHub
  • Eloquente ORM-Dokumente