6 sposobów na zapis danych w Laravelu.

by admin 0 Comments
6 sposobów na zapis danych w Laravelu.

W Laravelu możemy zrobić wiele rzeczy na wiele sposobów. Postaram się zapisać dane modelu do bazy danych na wiele sposobów. Część z nich na pewno nie będzie zgodna z best practices. Ten wpis należy traktować lekko z przymrużeniem oka.

Projekt

Tutaj znajduje się kod projektu, który możesz go pobrać i uruchomić u siebie lokalnie.

Dla ciekawskich umieszczam strukturę bazy danych na której dziś operujemy:

struktura tabeli products

Sposób 1: Czysty SQL.

Chyba to nie najlepszy sposób dodawania danych do bazy danych, ale muszę go pokazać.

Używam z fasady DB, aby dodać zapytanie SQL oraz funkcji pomocniczej sprinf() do zwrócenia sformatowanego zapytania:

public function store(ProductRequest $request)
{
$name = $request->get('name');
$price = $request->get('price');
$description = $request->get('description');
$active = $request->get('active');

DB::raw(sprintf("INSERT INTO products VALUES (NULL, '%s','%d', '%s', '%d', NULL, NULL)", $name, $price, $description, $active));
}

Sposób 2: DB::insert()

Kolejny raz korzystamy z Fasady DB i tym razem skorzystamy z metody statycznej insert w parametrze uzupełniamy dane, które mają zostać uzupełnione.

public function store(ProductRequest $request)
{
DB::table('products')->insert([
'name' => $request->get('name'),
'price' => $request->get('price'),
'description' => $request->get('description'),
'active' => $request->get('active')
]);
}

Sposób 3: Model::create()

Sposób działania podobny co poprzedni, lecz tutaj wywołujemy go bezpośrednio z modelu.

public function store(ProductRequest $request)
{
Product::create([
'name' => $request->get('name'),
'price' => $request->get('price'),
'description' => $request->get('description'),
'active' => $request->get('active')
]);
}

Sposób 4: new Model

Możemy zdefiniować model jako nowa zmienna i wstrzyknąć tablicę danych do konstruktora modelu.

Należy pamiętać o tym, aby na końcu, później wywołać metodę z modelu save().

public function store(ProductRequest $request)
{
$product = new Product([
'name' => $request->get('name'),
'price' => $request->get('price'),
'description' => $request->get('description'),
'active' => $request->get('active')
]);
$product->save();
}

Sposób 5: fill()

Możemy skorzystać z metody fill, która wypełni nam wszystkie pola, które są podane w modelu w właściwości $fillable.

public function store(ProductRequest $request)
{
$product = new Product();
$product->fill([
'name' => $request->get('name'),
'price' => $request->get('price'),
'description' => $request->get('description'),
'active' => $request->get('active')
]);
$product->save();
}

Sposób 6: $model->property

Na samym początku definiujemy model, ustawiamy wartości właściwości obiektu, finalnie używamy metody save() aby zapisać dane.

public function store(ProductRequest $request)
{
    $product = new Product();
    $product->name = $request->get('name');
    $product->price = $request->get('price');
    $product->description = $request->get('description');
    $product->active = $request->get('active');
    $product->save();
}

Bonus: Mass Assignment

Dodatkowo pokażę sposób jak lekko uprościć sobie życie, nie pisząc zbędnego kodu. W przykładzie 2,3,4,5 mogliśmy to troszkę uprościć sobie sprawę nie podając tablicy, tylko od razu podać parametry jakie otrzymaliśmy z requesta.

Należy pamiętać że w tablicy asocjacyjnej muszą odpowiadać nazwom kolumn w bazie danych. Przydatne jest to dla małych i prostych tabel.

public function store(ProductRequest $request)
{
    Product::create($request->validated());
}

Możemy zauważyć że można zapisać dane bazy za pomocą jednej linijki.

$request->all() vs $request->validated()

Jak widać w poprzednim przykładzie użyłem metody z requesta validated. Więcej o requestach możesz przeczytać w tym wpisie. Jaka jest prosta różnica pomiędzy nimi? Metoda validated() zwraca tablicę danych, która została poddana walidacji.

Jeżeli usunąłbym jedną regułę walidacji z ProductRequest, tablica z metody validated() zwracałaby o jedną pozycję mniej niż tablica z metody all().

Podsumowanie – którego sposobu użyć?

To zależy, moja ulubiona odpowiedź. Każdy z tych przykładów miał jeden cel, zapisać dane do bazy danych. Na pewno szerokim łukiem omijałbym dwóch pierwszych sposobów. Warto wybrać jedną konwencję w projekcie i trzymać się jej.

Ja najczęściej stosuję sposób czwarty z new Model. Ten sposób najbardziej mi podpasował.

Znasz jakiś dodatkowy sposób? Podziel się z nim w komentarzu.

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>