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ėjebooks_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 metodaswith()
. 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