2016-09-01 4 views
0

Привет, Я работаю над интерфейсом CRUD для обновления события.Laravel - Form - Eager Loading

Класс событий Модельсобытие принадлежит много Организатор

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

Организатор класса Модель

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

контроллер Eventя отправить событие вместе с его организатором (ами)

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

вид event.edit

<? $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() !!} 

На данный момент я вижу весь список организаторов, которые хорошо, но значение по умолчанию или выбранное не соответствует значению, связанному с событием.

Я попытался

<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> 

но выбранный организатор всегда первым, даже если $ organizer-> ID = 2

Любая помощь будет приветствоваться. Спасибо

ответ

0

Ответ # Update после предложения Leon

Это то, что мне нужно сделать, чтобы она работает

<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> 

Чтобы сделать выбор по умолчанию, вы должны изменить третий аргумент (https://laravelcollective.com/docs/5.0/html#opening-a-form)

1

При работе с Form::model было бы проще работать с именем объекта в базе данных.

Если у вас есть

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

Тогда значение формы будет установлен $event->organizer->id если он существует.

Также из вашего прецедента это выглядит как организатор принадлежит к событию. Вы не показываете модель организатора, но внутри модели события вы определяете отношения «многие ко многим». Это означает, что у вас есть $event->organizers.

Из имеющейся информации вы можете захотеть изменить отношение к

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

Изменение/Обновление (после дополнительной информации)

Это теперь ясно, вы на самом деле работает с много-to-много коллекция. Мне не удалось получить привязку к модели Form для работы с коллекциями ownToMany, поэтому вам нужно установить третий параметр для физического определения организаторов, которые необходимо выбрать.

Самый элегантный способ, которым я знаю, - определить аксессуар на вашем объекте Event для идентификаторов организатора мероприятия. Таким образом, вы можете использовать вызов для old для ошибки проверки, а затем определить значение по умолчанию, которое является значениями для первоначального редактирования.

Обратите внимание, что в форме мы используем массив для нескольких значений.

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

Внутри вашей модели вы добавляете аксессуар для возврата идентификаторов.

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

Здравствуйте, Leon, я изменил назначение функций, поскольку событие принадлежит многим организаторам. Я добавил картинку таблицы event_organizer, которая является перекрестной ссылкой betweevent event_id и organizer_id. Я пробовал ваш синтаксис, но orgnizer все еще всегда первый. –

+0

Я также добавил структуру объекта события, которую хочу обновить. Это событие $ является тем, которое у меня есть в событии event.edit при отладке. –