Erstellt ein Model, je nachdem ob das Flag -m
mitgegeben worden wurde mit oder ohne Migration.
php artisan make:model Book -m
Erstellt einen Controller, je nachdem ob das Flag -r
mitgegeben worden wurde, wird dieser als Resource-Controller erstellt.
php artisan make:controller BookController -r
Models repräsentieren unsere Tabellen in der Datenbank aus objektorientierter Sicht.
Book::create([
"name" => "Harry Potter und der Stein der Weisen",
"author" => "J.K. Rowling",
"isbn" => "3551557411",
]);
Name | Resource-Controller Methode | HTTP-Methode | PFAD | Beschreibung |
---|---|---|---|---|
Browse | index | GET | /books | Zeigt alle Resourcen an (Teil der REST-Konvention) |
Read | show | GET | /books/{id} | Zeigt eine Resource mit der angegebenen ID (Teil der REST-Konvention) |
Edit | update | PUT/PATCH | /books/{id} | Editieren einzelner oder aller Daten einer bereits bestehenden Resource (Teil der REST-Konvention) |
Add | store | POST | /books | Erstellen einer Resource (Teil der REST-Konvention) |
Delete | destroy | DELETE | /books/{id} | Löschen einer Resource (Teil der REST-Konvention) |
- | create | GET | /books/create | Formular zum erstellen von der Resource (Laravel spezifisch 🐠)
- | edit | GET | /books/{id}/edit | Formular zum editieren einer Resource (Laravel spezifisch 🐠)
Was | Wie | Beispiel |
---|---|---|
Controller | singular | ArticleController |
Route | plural | books/1 |
Named route | snake_case with dot notation | users.show_active |
Model | singular | User |
hasOne or belongsTo relationship | singular | articleComment |
All other relationships | plural | articleComments |
Table | plural | article_comments |
Pivot table | singular model names in alphabetical order | article_user |
Table column | snake_case without model name | meta_title |
Model property | snake_case | $model->created_at |
Foreign key | Model Name im singular mit _id suffix | author_id |
Migration | snake_case_mit_datum_und_uhrzeit | 2017_01_01_000000_create_articles_table |
Method | camelCase | getAll |
Method in resource controller | table | store |
Method in test class | camelCase | testGuestCannotSeeArticle |
Variable | camelCase | $articlesWithAuthor |
Collection | descriptive, plural | $activeUsers = User::active()->get() |
Object | descriptive, singular | $activeUser = User::active()->first() |
Config and language files index | snake_case | articles_enabled |
View | kebab-case | show-filtered.blade.php |
Config | snake_case | google_calendar.php |
Contract (interface) | adjective or noun | Authenticatable |
Trait | adjective | Notifiable |
Beziehungen werden in Laravel in den Models erstellt.
Beispielsweise kann ein Bürger genau eine Passnummer haben. Verknüpfung im Model des Bürgers (citizen):
class Citizen extends Model {
public function pass() {
return $this->hasOne('Pfad zum Model\pass');
}
}
Verknüpfung im Model Personalausweisnummer (pass):
class Pass extends Model {
public function citizen() {
return $this->belongsTo('Pfad zum Model\citizen');
}
Wichtig hierbei ist, dass man nicht zweimal hasOne nehmen darf.
Bei einer 1:N-Beziehung gibt es die Methoden "belongsTo" und "hasMany". Hier ein Beispiel aus dem Skript mit "Books" und "Publisher". Ein Buch kann nur einen Publisher haben, umgekehrt kann aber ein Publisher mehrere Bücher veröffentlichen. Im Book-Model muss es dann wie folgt geschrieben werden:
class Book extends Model {
public function publisher() {
return $this->belongsTo('App\Book');
}
}
Es wird also gesagt, dieses Buch hat genau einen Publisher durch die belongsTo-Methode.
Im Publisher-Model sieht es dann wie folgt aus:
class Publisher extends Model {
public function books() {
return $this->hasMany('App\Book');
}
}
Wichtig ist, dass in der Migration-File der Tabelle, in der der Fremdschlüssel steht, auch eine entsprechende Spalte erstellt wird. In der Books-Migration-File muss also für den Publisher noch eine entsprechende Spalte erstellt werden:
$table->unsignedBigInteger('publisher_id');
//Die publisher_id wird nun noch mit der ID aus der Tabelle Publisher verknüpft
$table->foreign('publisher_id')->references('id')->on('publisher');
Das Grundprinzip ist immer das selbe: $table->foreign("Spaltenname")->references("Primärspalte aus zu verknüpfender Tabelle")->on("Tabellenname welche verknüpft wird");
Bei N:M-Beziehungen gibt es nur eine Methode, welche in beiden Models verwendet werden muss. Sie heißt "belongsToMany". Ein Autor kann z.B. mehrere Bücher haben, ein Buch kann aber auch gleichzeitig mehrere Autoren haben (z.B. Handbücher für Programmiersprachen). im Author-Model ist der Code dann wie folgt:
class Author extends Model {
public function books() {
return $this->belongsToMany('App\Book');
Auf der Gegenseite im Book-Model ist der Code (fast) der selbe:
class Book extends Model {
public function authors() {
return $this->belongsToMany('App\Author');
Bei N:M-Beziehungen muss man immer einen Hilfstabelle erstellen, welche die zwei Primärschlüssel entgegen nimmt. Sehr wichtig ist, dass diese Migration-File erst nach den zwei Migration-Files für die Books und die Authors ausgeführt wird! In der Hilfstaballe werden dann diese Spalten erstellt:
$table->unsignedBigInteger('author_id');
$table->foreign('author_id')->references('id')->on('authors');
$table->unsignedBigInteger('books_id');
$table->foreign('books_id')->references('id')->on('books');
Code in web.php
Route::get('/artists', function() {
return view('artists', ['artists'=>Artist::all()]);
});
//Mit dem Befehl Artist::all() werden alle Artisten, die in der Tabelle gespeichert sind abgerufen und im Array gespeichert
Code in dem View 'artists':
<ul>
@foreach($artists as $artist)
<li>{{$artist->name}}</li>
@endforeach
</ul>
Der Befehl @foreach lädt nun alle artists, die im Array gespeichert sind in die Variable $artist. Für jeden $artist wird dann der Name als Item einer Liste ausgegeben.
In diesem Beispiel wird über eine for-Schleife Artists erstellt und der Name, der an der jeweilgen Stelle steht, verwendet.
public function run()
{
$artists = ['Artist1', 'Artist2', 'Artist3', 'Artist4', 'Artist5', 'Artist6, 'Artist7'];
for($i = 0; $i < count($artists); $i++) {
factory(Artist::class)->create(["name" => $artists[$i]]);
}
}
Mit "count($artists)" wird die Anzahl der im Array gespeicherten Werte herausgefunden. Der Name wird in Verbindung mit einer Factory erstellt. Den Namen geben wir hier vor, alle anderen Daten werden aber mit einem faker erstellt (später dazu mehr).