Laravel – bazy danych

  laravel

Po wprowadzeniu danych w database.php jeszcze fajnie ogarnąć plik .env w root directory i tam też wprowadzić dane.

Migrate problem

https://laravel-news.com/laravel-5-4-key-too-long-error

Automatyczny prefix tabel

//in config/database
'prefix' => env('DB_TABLE_PREFIX', 'abc')

//in env
DB_TABLE_PREFIX=abc

Tworzenie nowej tabeli

php artisan make:migration nazwa_klasy_tworzącej --create="nazwaNowejTabeli"

Zabezpieczanie klasy (umożliwianie wprowadzania kilku wybranych pól jednocześnie)

nazwa tej funkcji musi być „fillable”

class Video extends Model
{
    protected $fillable = [
    	'title',
    	'url',
    ];
}

Wyciąganie wszystkich obiektów z bazy

Video::latest()->get();

Wyciąganie wyfiltrowanych rzeczy z bazy

Video::find($id);
(albo findOrFail zamiast find - wtedy przy braku takiego id, będzie 404 zamiast 500)

Rozszerzanie query (query scopes) – przejdź do modelu

Zliczanie zapytań idących do bazy danych

np w controllerze najpierw trzeba umieścić możliwość logowania, później można przypisać log do zmiennej i wyrzucić. Enable umieścić na początku a odczytanie query loga na końcu

use Illuminate\Support\Facades\DB;

DB::connection()->enableQueryLog();
$queries = DB::getQueryLog();
dd($queries);

Wyciąganie elementów np z wielu podkategorii z użyciem pivot table

tutaj wyciągamy relację images

$array = array(19,20);
$obj = Images_category::with('images')->whereIn('id', $array)->get();

to pobierze 2 obiekty z id 19 i 20 wraz z ich obrazkami, które lecą po pivocie

 

Pobieranie modelu (bądź kolekcji modeli) z warunkiem pivota

(w tym przypadku images_categories to relacja). $categoriesIdArray nie jest konieczne. W ten sposób po prostu przekazuje się do funkcji zmienne.

$posts = Image::whereHas('images_categories', function ($query) use ($categoriesIdArray) {            
   $query->whereIn('id', $categoriesIdArray);
})->latest()->get();

Pobieranie elementów z wieloma kategoriami/tagami jednocześnie

czyli np pobieramy wpisy, które mają tagi pumpkin oraz fall jednocześnie

$posts = Post::whereHas('tags', function($q) use ($tags)
{
    $q->whereIn('id', $tags);
}, '=', count($tags))->get();

Paginacja

$images = Image::latest()->paginate(20);

//oraz w widoku
{{ $images->links() }}

żeby mieć nad paginacją większą kontrolę, możesz opublikować vendor (co opublikuje Ci pliki do resources/views/vendor

php artisan vendor:publish --tag=laravel-pagination

więcej w dokumentacji o paginacji

Paginacja z atrybutami w url-u

domyślnie linki w paginacji pominą atrybuty w url-u. Trzeba dodać coś takiego:

najpierw w controllerze używamy inputa

use Illuminate\Support\Facades\Input;

następnie w funkcji wrzucamy nową zmienną i przekazujemy ją do widoku

$additional = Input::except('page');

a w widoku paginację wyświetlamy tak

{{ $results->appends($additional)->links('vendor.pagination.bootstrap-4') }}

Czyste zapytania sql

Żeby wszystko było bezpieczne, trzeba zmienną przekazać w drugim parametrze funkcji select

$someVariable = Input::get("some_variable");

$results = DB::select( DB::raw("SELECT * FROM some_table WHERE some_col = :somevariable"), array(
   'somevariable' => $someVariable,
 ));