Laravel Model kurz mal erklärt

Heute mal leichte Kost. Laravel Model. Was ist das und was stellt man damit an, wie erstellt man ein Model und was kann es so alles.

Genug der langen Worte, fangen wir an!

Was ist ein Model?

Dafür blicken wir auf ein DesignPattern der Programmierung und zwar dem MVC Muster. MVC steht für Model, View und Controller.

Im groben kann man sagen, das Model handelt die Business Logik eines MVC basiertem Framwork. In Laravel enthält das Model die logische Struktur (Schema) und die Beziehungen (Relations) der dahinterliegenden Datenressourcen. Bei Laravel hat jede Datenbank Tabelle ein Model mit dem es mit der Anwendung kommuniziert. Also lesen, schreiben, updaten, löschen wird über das Model erst ermöglicht und verwaltet. Du findest seit Laravel 8 die Models unter app/models. Lange Zeit waren die Models im Root von app hinterlegt. Was keiner so richtig verstand, außer Oti (Taylor Otwell).

Wie kann man ein Laravel Model erstellen

Mit dem Kommandozeilen Tool artisan lässt sich bei Laravel so fast alles wichtige erstellen. Leider bis heute noch nicht die Views. Aber mit einem kleinen Workaround geht auch das. Aber zurück zum Thema. Ein Model erstellt ihr mit folgender Bash Zeile:

php artisan create:model <model-name>

Ersetzt <model-name> mit dem Namen den ihr wollt und zwar im Singular. Kleines Beispiel:

php artisan make:model Product -m

Wichtig ist hier anzumekren: dass ihr den Model namen in CamelCase schreibt und Singular bezeichnet sowie der erste Buchstabe groß sein sollte.

Man kann dem Artisan Command noch Parameter mitgeben. Zum Beispiel:

  • -m bzw. –migration (erstellt eine Migartiondatei)
  • -c (erstellt den dazugehörigen Controller. In umserem Fall also ProductController)
  • -r (erstellt eine Ressource. ProductRessource)

Wenn man den make:model Command ausführt erstellt uns Laravel artisan unter app/model/. Unser Model.

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    //
}

Ihr könnt Euch mal aus Jucks in eurem vendor Verzeichnis die abgleitete abstrakte Model (Illuminate\Database\Eloquent\Model) Klasse anschauen. Hier wird einem bewusst, welche Vielfältigkeit mn hier einstellen bzw. überschreiben kann. Ihr könnt in eurem Model die Default Werte einfach überschreiben. Kleines Beispiel: Die Membervariable protected $perPage = 15. Wollt ihr eine Pagination mit nur 10 Treffern pro Seite. Schreibt dazu dann protected $perPage = 10; und schon habt ihr den Defaultwert überschrieben.

Wichtige Variablen die ihr eventuell mal anfassen müsst wären:

protected $table = ““; // Euer Datenbantabellennamen

protected $primaryKey = “id“; // Laravel nimmt an, dass jede Tabelle id als Primären Schlüssel verwendet. Falls das nicht so ist könnt ihr dies hier ändern

public $timestamps = false; // Laravel fügt von Haus aus jeder Tabelle noch zwei Spalten (created_at und updated_at) hinzu. Falls ihr das nicht wünscht, überschreibt die public Membervariable $timestamp mit false;

protected $hidden = [ ‘password’, ‘remember_token’]; // wenn Ihr ein Model abfragt werden euch alle Spalten ausgeliefert. Es sein den ihr wollt, dass bestimmte Felder nicht angezeigt werden sollen. Wie zum Beispiel das Passwort bei einer Abfrage nach dem User::find(1);

protected $fillable = [‘name’,’email’,’password’]; // sind Felder die geupdated werden dürfen.

protected $guarded = []; // Ist ein Array mit Spaltennamen des Models die nicht geupdated werden dürfen

MySQL Datenbankserver im lokalen Netzwerk einrichten

Es kommt mal vor, dass man beim Entwickeln die Test, Entwickler Datenbank nicht auf einem Liveserver sowie auf dem lokalen Rechner einrichten möchte. Und arbeiten an der Livedatenbank sollten sowieso keine Option sein. Jedenfalls kann der Wunsch nach einer Testdatenbank, die nicht auf dem Entwicklerrechner installiert ist unterschiedliche Gründe haben. Ein häufiger Grund ist wohl, wenn die Datenbank sehr mit Testdaten aufgebläht ist. So war das bei einem großen Kunden von mir. Die Datenbank war so riesig, dass man den Dump nicht auf den Rechner hätte packen können. Wahrscheinlich wurden dort alle Flatulenzen der letzten 30 Jahre aller Menschen, samt Geodaten und Meta(n)daten in die Datenbank geschrieben. Der Dump alleine war ein Wochenprojekt. Es war wirklich einfach grauenvoll. Unabhängig von den Gründen, ist es auch nett zum Verständnis im eigenen Netzwerk eine Datenbank auf einem am Netzwerk angeschlossenen Rechner (Server) zu kontaktieren.

Was muss gemacht werden. Wir bräuchten mindestens zwei Rechner. Der eine (Host) der die Datenbank hat und der andere (Client) der über das Netzwerk drauf zugreift. Dazu benötigen wir natürlich auch die lokale IP Adresse des Datenbankrechners. Im Grunde könnten wir auch sagen, wir brauchen die IP Adresse von unserem lokalen Datenbankservers. Unter der Linux Distribution Ubuntu geht das rasch mit der Konsole.

hostname -I

Der erste Wert wäre die benötigte IP Adresse. In meinem Fall die 192.168.1.45

Nun müssen wir als erstes auf dem Datenbankserver die Configuration anpassen. Diese ist nämlich Standardmässig nur auf Zugriffe innerhalb des installierten Rechners nutzbar. Also nur localhost. Dazu müssen wir in einer Konfigurationsdatei von MySQL eine Zeile ändern.

Das ändert man ebenfalls über die Ubuntu Konsole:

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 

In der Zeile bind-address: 127.0.0.1 ersetzten wir den Wert 127.0.0.1 mit 0.0.0.0 . Das bedeutet nun das Remote Rechner die Datenbank ansprechen können. Ansonsten wird die Ansprache von MySQL direkt verweigert.

Standardmäßig ist ein MySQL Nutzer nur Abrufbar vom Rechner auf dem MySQL installiert ist. Mit anderen Worten nur localhost. Man kann sich die Nutzer und deren Hosts ausgeben lassen:

mysql -u root -p
mysql_>  SELECT USer, Host, authentication_string FROM mysql.user;

Im nächsten Schritt müssen wir auf dem Datenbankserver einen Nutzer anlegen, der berechtigt ist, von einem externen Aufruf zu antworten. Wir loggen uns dafür über die Konsole auf den Datenbankserver ein.

mysql -u root -p

nun

mysql_> CREATE USER 'remote_user'@'%' IDENTIFIED BY superCyptoPassword_123';

das Prozentzeichen dient hier als Wildcard und berechtigt Remote Rechner den Zugriff auf die Datenbank. Statt einer Wildcard (%) kann man auch mit festen IP oder IP Bereichen arbeiten.

_> CREATE USER 'remote_user'@'192.168.1.45' IDENTIFIED BY superCyptoPassword_123';
_> CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY superCyptoPassword_123';
und Standard wäre:
_> CREATE USER 'remote_user'@'localhost' IDENTIFIED BY superCyptoPassword_123';

danach berechtigen wir den neuen User, dass er auf alle Datenbanken auf dem Datenbankserver zugreifen darf.

GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';

Alternativ kann man den User auch nur auf eine bestimmte Datenbank zugreifen lassen oder gar nur auf eine bestimmte Tabelle in einer Datenbank eingrenzen. Ebenfalls kann man Lese und Schreibrechte einen einzelnen Nutzer zuweisen. Dazu mal in einem anderen Tutorial. Wenn ihr das wollt?

That it.

mysql> SELECT Ueer, Host, authentication_string FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| USer             | Host      | authentication_string                     |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.session    | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| icke           | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| remote_user         | %         | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+------------------+-----------+-------------------------------------------+

SeoTheater Autoren