Etykiety

linux (14) php (14) Laravel (9) mysql (9) Hardware (8) Windows (6) sieci (5) PowerShell (4) software (4) MariaDB (3) apache (3) html (3) Microsoft (2) bezpieczeństwo LAN (2) cygwin (2) Akcesoria (1) CMS (1) Laptop (1) Open Office (1) drupal 7 (1) gpg (1) hosting (1) jquery (1) sieci LAN (1) xml (1) zabezpieczenie sieci LAN (1)

wtorek, 28 listopada 2017

Laravel od podstaw: modele

W poprzednich częściach szkolenia omówiłem podstawowe sposoby korzystania z bazy danych w środowisku Laravel. W części pt. Laravel od podstaw: migracje pokazałem jak tworzy się tabele bazodanowe, natomiast w części pt. Laravel od podstaw: tabele bazodanowe i dynamiczne widoki zaprezentowałem metodę DB::table(), która pozwala wykonywać rozmaite zapytania SQL. W tej części szkolenia skupię się na Modelach, które umożliwiają korzystanie z bardziej efektywnych metod bazodanowych.

Modele w Laravel


W środowisku Laravel każda tabela bazy danych może mieć odpowiedni "Model", służący do interakcji z tą tabelą za pomocą metod klasy. Modele umożliwiają wykonywanie zapytań SQL na odpowiadających im tabelach w prosty i efektywny sposób. Każdy z modeli jest rozszerzeniem klasy bazodanowej Illuminate\Database\Eloquent\Model, co oznacza, że można w nim korzystać z udostępnianych przez tą klasę metod.

Załóżmy, że chcemy stworzyć stronę internetową, na której mamy zamiar wyświetlać posty użytkowników. Do tego będzie nam potrzebna tabela bazodanowa z postami oraz model, poprzez który będziemy się odnosić do naszej tabeli, zapisywać w niej dane oraz pozyskiwać znajdujące się w niej informacje. Za chwilę omówię pracę z modelami na kilku praktycznych przykładach. Zanim przejdziemy do praktyki, uprzejmie proszę czytelników, którzy śledzili poprzednie części szkolenia o usunięcie z bazy danych utworzonej tabeli o nazwie posts, jeśli oczywiście ją utworzyli.

Cofanie migracji


Aby przywrócić poprzednią wersje bazy danych, można użyć polecenia php artisan migrate:rollback. To polecenie wycofuje ostatnią "partię" migracji, która może zawierać wiele plików migracji.

Zobaczmy jak taka akcja powinna wyglądać w przypadku naszej szkoleniowej aplikacji:

Cofanie migracji
Cofanie migracji w Laravel

Aby definitywnie usunąć tabelę posts, należy teraz usunąć skrypt migracji odpowiedzialny za jej tworzenie, co spowoduje, że w następnej migracji tabela nie zostanie utworzona. W naszym przypadku zrobię to tak:
rm database/migrations/2017_11_25_195109_create_posts_table.php -fr

Modele i migracje


Tworzenie modelu odbywa się za pomocą polecenia
php artisan make:model
Wraz modelem można automatycznie utworzyć odpowiednią migrację, dodając parametr –migration, ale nie jest to koniecznie, gdyż można utworzyć odpowiednią migrację w osobnym kroku, korzystając z omówionego w jednej z poprzednich części szkolenia sposobu.

Zanim przejdziemy do praktyki i utworzymy nasz pierwszy model, wspomnę, że w przypadku tworzenia migracji wraz z tworzonym modelem, Laravel automatycznie tworzy tabele noszącą nazwę w liczbie mnogiej odnośnie do nazwy modelu, oczywiście w języku angielskim. Przykładowo, jeśli model to post, tabela będzie nosiła nazwę posts. Można jednak temu zapobiec i nadać własną nazwę tabeli, określając ją parametrem -–create=nazwa_tabeli w osobnym kroku tworzenia migracji za pomocą polecenia php artisan make:migration

Zobaczmy jak to wszystko wygląda w praktyce. Z wiersza poleceń i z poziomu katalogu naszej szkoleniowej aplikacji nauka, stwórzmy nasz pierwszy model o nazwie Post, wraz ze skryptem migracyjnym, który będzie odpowiedzialny na utworzenie tabeli bazodanowej:

Tworzenie modelu
Tworzenie modelu

Jak widać, model został pomyślnie utworzony. Został również utworzony skrypt migracyjny, który, jak wiadomo z poprzednich części szkolenia, został zapisany w katalogu database/migrations względem katalogu naszej aplikacji.

Zmodyfikujmy teraz skrypt migracyjny i dodajmy do niego linie umożliwiające utworzenie kolumn związanych z tytułem i ciałem postów, podobnie jak we wcześniejszej części szkolenia. Docelowo metoda up() naszego szkoleniowego skryptu migracyjnego powinna wyglądać następująco:
public function up()  {

    Schema::create('posts', function (Blueprint $table) {

        $table->increments('id');

        $table->timestamps();

        // Tytuł i ciało posta

        $table->string('title');

        $table->text('body');

      })

Po zmodyfikowaniu skryptu w wyżej udokumentowany sposób możemy przystąpić do wdrożenia nowej wersji bazy danych:


Świetnie! Tabela powiązana z modele Post została pomyślnie utworzona. Zobaczmy teraz jak wygląda nasz model, który znajduje się w pliku app/Post.php:
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    //
}

?>

Jak zapewne łatwo czytelnikom wywnioskować z powyższego kodu i o czym już wspomniałem wcześniej, klasa \App\Post jest rozszerzeniem Illuminate\Database\Eloquent\Model, co oznacza, że możemy się poprzez instancje obiektów tej klasy odwoływać do bazodanowych funkcji modelu Eloquenta, jednak ich działania będą skierowane do tabeli posts, ponieważ jest to tabela bazy danych powiązana z modelem Post.

Na początku może się to wydawać trudne do zrozumienia, ale kilka przykładów powinno wszystko wyjaśnić. Zanim posłużę się Modelami w skryptach php naszej szkoleniowej aplikacji, udokumentuję kilka prostych operacji bazodanowych, które wykonam z poziomu interfejsu Laravel php artisan tinker.

Od modelu do tabeli


W części pt. Laravel od podstaw: tabele bazodanowe i dynamiczne widoki zaprezentowałem metodę DB::table() oraz sposób wprowadzania nowych rekordów do tabeli. Wyglądało to tak:
DB::table('posts')->insert(['title'=>'Nasz pierwszy post', 'body'=>'Lorem ipsum.... blabablabla...']);
Natomiast pozyskiwanie rekordów z tabeli wyglądało tak:
DB::table('posts')->get();
Te same działania można wykonać odwołując się do metod modelu Eloquent poprzez klasę naszego modelu, w bardziej przejrzysty i skuteczny sposób. Skorzystam z powłoki php artisan tinker, aby na początek wprowadzić kilka przykładowych rekordów do tabeli, a następnie je pozyskać na różne sposoby:


Więcej przykładów:


Wiemy już wystarczająco wiele, aby nasza szkoleniowa funkcja w pliku routes/web.php zwracająca widok z tytułami postów wyglądała następująco:
Route::get('/posty', function() {

        /**
         *  Ten sposób został omówiony w poprzedniej części szkolenia
         *  $posts = DB::table('posts')->get();
        */

        // Tego nauczyliśmy się teraz - widoczny efekt jest taki sam
        $posts = \App\Post::all();

        return view('posts.index', compact('posts'));

});

W niniejszej części szkolenia dowiedzieliśmy się czym są modele oraz jaka jest relacja pomiędzy nimi, a tabelami bazy danych. Nauczyliśmy się odwoływać do tabeli bazy danych poprzez klasę modelu, korzystając z metod Eloquent'a. Zobaczyliśmy kilka praktycznych przykładów pracy z modelami w powłoce php artisan tinker oraz praktyczne zastosowanie modelu szkoleniowego Post w funkcji trasy. W kolejnej części szkolenia mam zamiar zaprezentować kontrolery zasobów oraz zastosować w funkcjach kontrolerów zasobów to czego nauczyliśmy się o modelach i nieco więcej.

Serdecznie zapraszam do kolejnej części niniejszego szkolenia, p.t. Kontrolery zasobów

2 komentarze:

  1. Solidnie napisane. Pozdrawiam i liczę na więcej ciekawych artykułów.

    OdpowiedzUsuń
  2. Takie kwestie faktycznie są bardzo ważne ale niestety ja z komputerami raczej jestem na bakier. Na całe szczęście jak coś u mnie popsuje to wiem, że informatyk z https://informatyk.warszawa.pl/ jest w stanie sobie z tym poradzić błyskawicznie.

    OdpowiedzUsuń

Dodaj komentarz