Laravel 10.x karkasas. Select ir multiple select laukai

Select laukai yra naudojami duomenims, kurie turi ryšį su objektu 1:N.
Multiple select laukai yra naudojami duomenims, kurie turi ryšį su objektu N:N.

Select laukas

Select laukui valdiklio Books metoduose create() ir edit() turėtume sukurti objektų masyvą, pvz.:
$publishers = Publisher::orderBy('title', 'asc')->pluck('title', 'id');
$publishers->prepend('---Please select---', 0);
$publishers->all();
Metodas pluck() leidžia sukurti asociatyvų masyvą iš nurodytų lentelės laukų. Metodas orderBy() išrūšiuoja duomenis abėcėlės tvarka. Metodo prepend() pagalba prie masyvo pridėsime papildomą elementą '---Please select---' su indeksu 0.
Sukurtas masyvas turėtų būti perduotas vaizdui, kuriame bus atvaizduojamas select laukas, pvz.:
return view('admin.books.form', compact('publishers'));
Vaizde select() metodui nurodomas lauko pavadinimas ir masyvas:
{!! Form::label('publisher_id', 'Publisher: ') !!}
{!! Form::select('publisher_id', $publishers) !!}

Multiple select laukas

Multiple select lauką sukursime autoriams, kadangi viena knyga gali turi daugiau nei vieną autorių ir select laukas šiuo atveju netinka.
Norint sudaryti asociatyvų masyvą iš autorių pilnų vardų panaudosim selectRaw() metodą, kurio pagalba galima rašyti "grynas" SQL užlausas, t. y. tokias užklausas, kurioms Laraval karkasas nėra numetęs jokių metodų. SQL užklausoje panaudosim CONCAT() funkciją, kurios pagalba išrinksim iš autorių lentelės vardus, antrus vardus ir pavardes ir apjungsim juos į vieną lauką full_name. SQL funkcija COALESCE() leidžia ignoruoti NULL laukus, nes ne visi autoriai turi antrą vardą. O orderBy() metodo pagalba išrūšiuosim autorius pagal jų pavardes. Taigi, valdiklio Books metoduose create() ir edit() pridėkit papildomą kodą :
$authors = Author::selectRaw("CONCAT(COALESCE(first_name,''),' ',COALESCE(middle_name,''),' ',COALESCE(last_name,'')) AS full_name, id")
    ->orderBy('last_name', 'asc')
    ->pluck('full_name', 'id');
$authors->prepend('---Please select---', 0);
$authors->all();
Sukurtas masyvas turėtų būti perduotas vaizdui, kuriame bus atvaizduojamas multiple select> laukas, pvz.:
return view('admin.books.form', compact('authors'));
edit() metode papildomai reiktų sukurti pasirinktos knygos autorių masyvą:
$book = Book::findOrFail($id);
$selected_authors = $book->authors()->get();
Ir perduoti jį vaizdui:
return view('admin.books.form', compact('book', 'selected_authors', 'authors'));
Vaizde select() metodui nurodomas lauko pavadinimas, autorių masyvas ir pažymėtų autorių masyvas (jei tai yra redagavimo forma), o prie papildomų lauko atributų nurodomas atributas multiple su reikšme true ir atributas name su reikšme authors[]:
{!! Form::label('author_id', 'Author(s): ') !!}
{!! Form::select('author_id', $authors, isset($book) ? $selected_authors : null, ['multiple' => true, 'name' => 'authors[]']) !!}

Metodai attach(), sync() ir detach()

Saugant knygos duomenis lentelėje books_authors reikėtų išsaugoti ir ryšius su autoriais, tam yra naudojamas metodas attach():
Book::create($request->all())->authors()->attach($request->authors);
Redaguojant knygos duomenis reikėtų atnaujinti ir knygos ryšius su autoriais, tam yra naudojamas metodas sync():
$book = Book::findOrFail($id);
$book->update($request->all());
$book->authors()->sync($request->authors);
Šalinant knygą iš duomenų bazės reikėtų pašalinti ir tos knygos autorius, tam yra naudojamas metodas detach(). Svarbu šį metodą įvykdyti prieš ištrinant pačią knygą, nes kitu atveju duomenų bazė neleis to padaryti:
$book = Book::findOrFail($id);
$book->authors()->detach();
$book->delete();

Duomenų atvaizdavimas pagal ryšį N:N

Norint atvaizduoti duomenis, kurie susiję su objektu (modeliu) ryšiu N:N, naudojamas metodas with(). Pvz., norint atvaizduoti visus knygos autorius valdiklio Books metode index() reiktų rašyti:
$books = Book::with('authors')->get();
O metode show():
$book = Book::with('authors')->findOrFail($id);
Vaizduose index.blade.php ir show.blade.php atitinkamai su foreach ciklu galite atvaizduoti visus autorius:
@foreach($book->authors as $author)
    {{ $author->first_name }} {{ $author->middle_name }} {{ $author->last_name }}
@endforeach

Paskutinį kartą puslapis keistas 2023-04-24

© Joana Katina 2016-2024. Visos teisės saugomos