Laravel - 表格 - 渴望加载

时间:2016-09-01 02:12:28

标签: forms laravel eloquent eager-loading

您好我正在使用CRUD界面更新活动。

事件类型号 一个事件属于许多组织者

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();
   }
}

活动控制器 我发送活动及其组织者

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

event.edit view

<? $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-&gt; id = 2

,所选的组织者也始终是第一个

欢迎任何帮助。谢谢

2 个答案:

答案 0 :(得分:1)

使用Form::model时,可以更轻松地使用数据库中属性的名称。

如果你有

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

然后,如果表单的值存在,则表单的值将设置为$event->organizer->id

同样来自您的用例,它看起来像一个组织者属于一个事件。您不显示组织者模型,但在事件模型中定义了多对多关系。这意味着您拥有$event->organizers

根据可用信息,您可能希望将关系更改为

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

修订/更新(在附加信息之后)

现在很清楚,您确实在使用多对多集合。我还没有设法使用Form模型绑定来使用belongsToMany集合,因此您需要设置第3个参数来物理定义需要选择的组织器。

我所知道的最优雅的方法是在Event对象上为事件管理器ID定义一个访问器。这样,您可以使用old调用验证错误,然后定义默认值,这是初始编辑的值。

请注意,我们在表单中使用了一个数组来表示多个值。

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

然后在模型中添加访问者以返回ID。

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

答案 1 :(得分:0)

在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