Laravel - 表单 - 预加载

Laravel - Form - Eager Loading

您好,我正在开发用于更新事件的 CRUD 界面。

活动Class模型一个活动属于多个组织者

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

组织者Class模特

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

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

,选定的组织者总是第一个

欢迎任何帮助。谢谢

在使用 Form::model 时,使用数据库中 属性 的名称会更容易。

如果你有

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

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

另外,从您的用例来看,组织者似乎属于某个事件。您不显示组织者模型,但在事件模型中定义多对多关系。这意味着您有 $event->organizers.

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

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

修正/更新(附加信息后)

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

据我所知,最优雅的方法是在 Event 对象上为活动组织者 ID 定义一个访问器。通过这种方式,您可以调用 old 来处理验证错误,然后定义默认值以及初始编辑的值。

请注意,在表单中我们为多个值使用数组。

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

然后在模型中将访问器添加到 return ID。

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

回答# 根据莱昂的建议更新

这就是我需要做的才能让它发挥作用

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