2016-09-01 4 views
0

Hallo Ich arbeite an einer CRUD-Schnittstelle, um ein Event zu aktualisieren.Laravel - Form - Eager Loading

Ereignisklasse Modellein Ereignis gehört zu viele Veranstalter

class Event extends Model 
{ 
    public function organizers() 
    { 
     return $this->belongsToMany('App\Organizer')->withTimestamps(); 
    } 
} 

Organizer Klasse Modell

class Organizer extends Model 
{ 
    public function event() 
    { 
     return $this->belongsToMany('App\Event')->withTimestamps(); 
    } 
} 

Eine Ereignis-SteuerungIch sende das Ereignis zusammen mit seinem Veranstalter (s)

public function edit($id) 
{ 
    $event = Event::with(['organizers'])->findOrFail($id); 
    return view('event.edit', ['event' => $event]); 
} 

event.edit Ansicht

<? $organizers = DB::table('organizers')->lists('name', 'id'); ?> 

{!! Form::model($event, [ 
'method' => 'PATCH', 
'route' => ['eventUpdate', $event->id] 
]) !!} 

<div id="organizer_id-group" class="form-group"> 
    {{Form::select('organizer[id]', $organizers, null,['class'=>'form-control'])}} 
</div> 

{!! Form::submit('Update', ['class' => 'btn btn-primary']) !!} 

{!! Form::close() !!} 

Für den Moment, als ich die ganze Liste der Organisatoren sehen, was gut ist, aber die Standardwert, oder der ausgewählte Wert entspricht nicht dem mit dem Ereignis verknüpften Wert.

versuchte ich

<div id="organizer_id-group" class="form-group"> 
    @foreach($event->organizers as $key =>$organizer) 
     {{Form::select($organizer->id, $organizers, null,['class'=>'form-control'])}} 
    @endforeach 
</div> 

aber der ausgewählte Veranstalter ist immer der erste, auch wenn $ Organiser-> id = 2

Jede Hilfe wäre willkommen. Danke

Antwort

0

Antwort # Update nach Leon Vorschläge

Dies ist, was ich es funktioniert

<div id="organizer_id-group" class="form-group"> 
    {{Form::select('organizers[]', $organizers, $event->organizers->lists('id')->all(),['class'=>'form-control', 'multiple'])}} 
    <span class="help-block"></span> 
</div> 

Um eine Auswahl von Standard machen Sie das dritte Argument ändern müssen tun musste, um (https://laravelcollective.com/docs/5.0/html#opening-a-form)

1

Bei der Arbeit mit Form::model könnte es einfacher sein, mit dem Namen der Eigenschaft in der Datenbank zu arbeiten.

Wenn Sie

{{Form::select('organizer[id]', $organizers, null,['class'=>'form-control'])}} 

Dann wird der Wert des Formulars auf $event->organizer->id gesetzt werden, wenn es vorhanden ist.

Auch aus Ihrem Anwendungsfall sieht es aus wie ein Organizer gehört zu einem Ereignis. Sie zeigen das Organisatormodell nicht an, aber innerhalb des Ereignismodells definieren Sie eine Viele-zu-Viele-Beziehung. Dies bedeutet, dass Sie $event->organizers haben.

Aus den verfügbaren Informationen Sie können die Beziehung zu

return $this->belongsTo('App\Organizer');

Änderung/Update (nach Zusatzinformationen)

Es ist klar, jetzt ändern möchten, Sie sind in der Tat mit einem Arbeits Viele-zu-viele-Sammlung. Es ist mir nicht gelungen, die Form-Modell-Bindung für die Arbeit mit den Sammlungen von "belongsToMany" zu erhalten. Daher müssen Sie den 3. Parameter so einstellen, dass die Organisatoren, die ausgewählt werden müssen, physisch definiert werden.

Die eleganteste Art und Weise, die ich kenne, ist ein Accessor auf Ihrem Event Objekt für die Veranstalter-IDs zu definieren. Auf diese Weise können Sie einen Aufruf an old für einen Validierungsfehler verwenden und dann einen Standardwert definieren, der die Werte für die anfängliche Bearbeitung darstellt.

Beachten Sie, dass wir in der Form ein Array für die mehreren Werte verwenden.

{{Form::select('organizers[]', $organizers, old('organizers', $event->organizers_ids), ['class' => 'form-control', 'multiple'])}} 

Dann fügen Sie in Ihrem Modell den Accessor hinzu, um die IDs zurückzugeben.

public function getOrganizersIdsAttribute() 
{ 
    return $this->organizers->lists('id')->all(); 
} 
+0

Hallo Leon, ich habe die Benennung der Funktionen geändert, da ein Event zu vielen Veranstaltern gehört. Ich habe ein Bild der Tabelle event_organizer hinzugefügt, die ein Querverweis zwischen Ereignis-ID und Organizer-ID ist. Ich habe deine Syntax ausprobiert, aber der Orgnizer ist immer noch der erste. –

+0

Ich habe auch die Struktur des Ereignisobjekts hinzugefügt, das ich aktualisieren möchte. Dieses $ -Ereignis ist das, das ich in der event.edit-Ansicht beim Debugging habe. –

Verwandte Themen