Laravel | Tworzenie modeli
W tym artykule będę posługiwał się innym przeze mnie napisanym artykułem, mianowicie:
Celem niniejszego artykułu jest chęć dynamicznego dodawania wpisów do strony. Chcąc wykonywać jakiekolwiek operacje na bazie danych (dodawanie, edytowanie, usuwanie wpisów) musimy posłużyć się ostatnią składową MVC mianowicie modelem. To właśnie za jego pomocą możemy wykonywać wszystkie powyżej wymienione operacje w bazie danych. Pamiętaj również, że dla każdej tabeli powinien być utworzony osobny model. Można go traktować jako pośrednika do którego musimy się udać, gdy chcemy wykonać jakąkolwiek operację na bazie danych
Tworzenie modelu
Chcąc utworzyć model musimy przejść do konosli i posłużyć się poleceniem:
php artisan make:model Post
Konwencja nazewnictwa modelu wygląda tak:
– zawsze występuje w liczbie pojedynczej
– nazwa zaczyna się od WIelkiej litery
– nazwa musi odzwierciedlać liczbę pojedynczą nazwy tabeli którą ma obsługiwać, np: gdy tabela to Posts, to liczna pojedyncza – Post. Jest to bardzo ważne, gdyż właśnie Laravel dzięki takiemu zastosowaniu będzie automatycznie wiedział, że ten model (Post) tyczy się dokładnie tej tabeli (Posts).
Po utworzeniu modelu powinien się on znajdować w:
app/Post.php
a jego zawartość powinna wyglądać tak:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // }
Jak widzisz w zasadzie nic się tam nie znajduje, ale już samo jego utworzenie pozwala Nam na posługiwanie się nim.
Spróbujmy teraz dodać jakiś wpis manualnie za pomocą jakiegoś klienta bazy danych i po jego dodaniu przejdźmy do konsoli i wykorzystamy dodane przez artisan narzędzie, które nazywa się Tinker
php artisan tiner
Narzędzie to pozwala wykonywać nam polecenia php tak jakby z wnętrza aplikacji. Dzięki tej interaktywnej konsoli możemy odwołując się do Naszego modelu (ale po namespace-ie) wyświetlić wszystkie wpisy poleceniem:
App\Post::all()
Zastanawiać Cię może skąd wzięło, się to ::all
. W trakcie tworzenia modelu co możesz wyżej zobaczyć Nasz model rozszerza główny Model, dzięki czemu ma dostęp do metod zadeklarowanych w głównym modelu, tu jest to napisane:
use Illuminate\Database\Eloquent\Model;
W rezultacie metoda ta zwróciła nam obiekt Collection:
=> Illuminate\Database\Eloquent\Collection {#3995 all: [ App\Post {#3928 id: 1, title: "You are done.", content: """ <b>Fired. Do not show your face at the laundry again.</b> Stay\n away from Pinkman. Do not go near him. Ever. Are you listening\n to me? """, date: "2020-11-30 09:29:44", type: "text", image: null, created_at: null, updated_at: null, }, ], }
Jest to bardzo ważne, że jest to obiekt Collection, dlatego że obiekt ten posiada różne metody, a jedną właśnie z nich jest ::all
Był to pierwszy sposób, dzięki któremu dodaliśmy wpis do bazy ręcznie, a teraz wykorzystamy do tego php artisan tinker. Są na to dwa sposoby:
1 sposób gdzie tworzymy nowy obiekt i przekazujemy do niego tablicę z danymi.
$post = new App\Post(['title' => 'tytuł', date => now(), 'type' => 'photo', 'image' => '/images/image-01.jpg'])
Wiąże się z tym jednak jeden problem, który wyniknie po wykonaniu polecenia:
Illuminate/Database/Eloquent/MassAssignmentException with message 'Add [title] to fillable property to allow mass assignment on [App/Post].'
Wbrew pozorom nie jest to nic złego. Jest to zabezpieczenie Laravel przez masowym przekazywaniem danych. Aby zezwolić na takie działanie musimy przejść do modelu Post i zadeklarować w nim, że zgadzamy się na przekazywanie od razu wszyskich danych. Również tu są dwa sposoby na to aby to zrobić:
1 sposób, to taki gdzie wpiszemy wszystkie tabele, które możemy wypełniać masowo:
protected $fillable = ['title', 'content', itd...];
2 sposób jest odwrotnością pierwzego, czyli wpisujemy kolumny których nie możemy masowo uzupełniać:
protected $guarded = [];
a skoro przekazujemy pustą tablicę, to oznacza, że wszystkie pola możemy masowo przekazać do uzupełnienia.
Uwaga!
Po wprowadzeniu zmian tinker nie wyłapie tego, że zezwoliliśmy na masowe dodawanie danych bo on już wczytał Nasz model. Należy z niego wyjść poleceniem exit
i wejść jeszcze raz: php artisan tinker
Gdy już nam się uda przekazać tablicę do obiektu $post musimy jednak wiedzieć, że nie zostanie on automatycznie dodany do bazy danych. Czeka na nas jeszcze jednaoperacja mianowicie:
$post->save()
Teraz to już jest wszystko, aby umieścić wpis w bazie danych 🙂