#php #html #laravel #database #drop-down-menu
#php #html #laravel #database #drop-down-menu
Вопрос:
Я использую Laravel 8 и пытаюсь каскадировать некоторые выпадающие списки.
Я следовал некоторым учебным пособиям, но это на самом деле не работает для меня, так как моя структура базы данных немного сложнее, и я использую объединения.
Пример структуры базы данных: Таблица клиентов (Таблица Кундена) Таблица местоположений (Стандартная таблица) Таблица размещения клиентов (Таблица Kunde_Standorte)
У клиента может быть несколько местоположений и наоборот, поэтому мне нужна промежуточная таблица.
Компонентная логика:
public $kunde = null; public $standort = null; public $projekt = null; public $selectedKunde = null; public $selectedStandort = null; public $selectedProjekt = null; public function mount(){ $this-gt;kunde = Kunde::all(); $this-gt;standort = collect(); $this-gt;projekt = collect(); } public function render() { return view('livewire.dropdown'); } public function updatedSelectedKunde($kunde_id) { if (!is_null($kunde_id)) //Check if a customer is selected { $this-gt;standort = Kunde_Standort::where('kunde_standorte.kunde_id', $kunde_id) -gt;leftJoin('standorte', 'kunde_standorte.standort_id', '=', 'standorte.standort_id') -gt;select('standorte.*', 'kunde_standorte.*') -gt;get(); $this-gt;selectedStandort = null; $this-gt;projekt = null; $this-gt;selectedProjekt = null; } } public function updatedSelectedStandort($kunde_standort_id) { if (!is_null($kunde_standort_id)) { //Check if a location is selected $this-gt;projekt = Kunde_Standort_Projekt::where('kunde_standort_projekte.kunde_standort_id', $kunde_standort_id) //Fülle die Project Dropdown -gt;leftJoin('projekte', 'kunde_standort_projekte.projekt_id', '=', 'projekte.projekt_id') -gt;select('projekte.*', 'kunde_standort_projekte.kunde_standort_projekt_id') -gt;get(); $this-gt;selectedProjekt = null; } }
Вид:
lt;div style="text-align: center"gt; lt;select class="form-control" required wire:model="selectedKunde"gt; lt;option value="" disable selected hiddengt;Wähle Kundelt;/optiongt; @foreach($kunde as $item) lt;option value ="{{$item-gt;kunde_id}}"gt;{{$item-gt;name}}lt;/optiongt; @endforeach lt;/selectgt; @if (!is_null($selectedKunde)) lt;select class="form-control" wire:model="selectedStandort"gt; lt;option value="" disable selected hiddengt;Wähle Standortlt;/optiongt; @foreach($standort as $item) lt;option value ="{{$item-gt;kunde_standort_id}}"gt;{{$item-gt;name}}lt;/optiongt; @endforeach lt;/selectgt; @endif @if (!is_null($selectedStandort)) lt;select class="form-control" wire:model="selectedProjekt"gt; lt;option value="" disable selected hiddengt;Wähle Projektlt;/optiongt; @foreach($projekt as $item) lt;option value ="{{$item-gt;kunde_standort_projekt_id}}"gt;{{$item-gt;name}}lt;/optiongt; @endforeach lt;/selectgt; @endif
The issue is, as soon as I select a «standort/location» the project dropdown is correctly filled, but I loose all names in the location dropdown. The id´s are still there, and the number of empty spaces matches. I just dont understand why I loose all names when I jump one dropdown further.
This applies to all dropdowns, this is just an example, I have about 6 cascading dropdowns which all show this behaviour. As soon as I go one further, all previous (except the Customer Dropdown, I guess because its filled in the mount) dropdowns loose their names but keep their values/id´s.
Im really struggling with this. My current workaround is, to fill every previous dropdown again through multiple queries. This is extremely tedious and bad (since I make a ton of db calls) and the further/more dropdowns I get, the more previous drop downs I have to fill.
Since my database structure is relatively complex, its a pain in the butt.
Any advice is highly appreciated.