Wie erstelle ich in Laravel ein einfaches Dropdown mit Key/Value (ohne eigene Datenbank-Tabelle)

Ich habe an zwei Stellen ein Dropdown-Menü mit englischem value und deutschem Label. Es lohnt sich nicht, dafür eine eigene Tabelle und Relations zu erstellen.

Die Eingabe ist leicht, aber wie kriege ich bei der Anzeige wieder einfach das deutsche Label?

Beispiel: Das Land eines Nutzers (Model/Tabelle = user)
Das HTML bei der Eingabe sieht wie folgt aus:

<select name="country">
<option value="DE">Deutschland</option>
<option value="GB">England</option>
<option value="CZ">Tschechien</option>

In der Tabelle users gibt es eine string Spalte country, wo dann z.B. DE gespeichert wird.

Wenn ich jetzt das Land eines einzelnen Nutzers ausgebe ($user->country), kriege ich statt Deutschland aber DE.

Die bisher einzige Möglichkeit, um das deutsche Label zu zeigen ist ein @switch im Blade-Template:

@switch( $user->country )
    @case('DE')
        Deutschland
        @break
    @case('GB')
        England
        @break
    @case('CZ')
        Siebdruck
        @break
@endswitch

Wenn ich jetzt aber 100 Länder in der Liste habe, wird das zu kompliziert und schwer, die Daten aus Anzeige und Eingabe zu synchronisieren (Habe ich das Land im Dropdown? Habe ich es im Anzeige-Switch?).

Ich möchte aber dafür kein eigenes Model anlegen, weil es nur an zwei Stellen auftaucht.
Habt ihr eine andere Idee, wie man das umsetzen kann?

@julius und @j.brueckner Habt ihr Laravel-Profis Ideen?

Hm, wie wäre es mit einem Accessor im User-Model?
https://laravel.com/docs/6.x/eloquent-mutators#defining-an-accessor

public function getCountryAttribute($value) { ... }

Innerhalb der Methode könnte so an zentraler Stelle der Switch platziert werden und greift dann immer, wenn $user->country aufgerufen wird.

2 Like

Cool, an einen Accessor hätte ich bei dem Fall gar nicht gedacht. Ist wahrscheinlich direkt die Lösung…

Danke für den code formatting-Edit. Ich war mir nicht sicher, ob das hier funktioniert… :wink:

Ja, Markdown funktioniert hier (= Discourse) bestens, sogar mit ```php

1 Like