使用Laravel表单模型绑定和复选框更新多对多的Eloquent关系

Yev*_*Yev 13 php laravel eloquent blade laravel-4

我有3张桌子:

  • ID
  • 名称
  • 图片

颜色

  • ID
  • 名称
  • 图片

door_colors

  • ID
  • door_id
  • COLOR_ID

和2个具有多对多关系的模型(每扇门有多种颜色,许多颜色与门到门重叠):

门模型

class Door extends Eloquent {
    public function colors()
    {
        return $this->belongsToMany('Color', 'door_colors');
    }
}
Run Code Online (Sandbox Code Playgroud)

颜色模型

class Color extends Eloquent {
    public function doors()
    {
        return $this->belongsToMany('Door', 'door_colors');
    }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个表单,我可以编辑门,并通过复选框更新可用的颜色.这是我的管理员门控制器

class AdminDoorsController extends AdminController {
    public function edit($id)
    {
        $data['door'] = Door::find($id);
        $data['colors'] = Color::all();
        return View::make('admin/doors/form', $data);
    }
}
Run Code Online (Sandbox Code Playgroud)

管理员窗体视图

{{ Form::model($door) }}
Colors:
@foreach ($colors as $color)
{{ Form::checkbox('colors[]', $color->id) }} {{ $color->name }}
@endforeach
{{ Form::close() }}
Run Code Online (Sandbox Code Playgroud)

问题1:如何进行设置,以便在输出复选框时,检查与当前门存在关系的复选框,并取消选中未关联的复选框.

问题2:一旦我勾选方框并点击提交,我将如何更新关系?$door->colors()->detach();清除这扇门的所有现有门,然后$door->colors()->attach($color_id_array);根据一系列颜色ID创建新门?

任何输入都表示赞赏!

use*_*496 20

问题1:您应该将其传递到包含表单的视图中,尽管它也可以在视图中正确显示,尽管这不是最佳实践.做类似的事......

$checkeds = Door::find(1)->colors()->lists('id');
Run Code Online (Sandbox Code Playgroud)

...你发现的门是正在更新的门.然后在循环中输出复选框之前,添加

$checked = in_array($color->id, $checkeds) ? true : false;
Run Code Online (Sandbox Code Playgroud)

然后你会改变

{{ Form::checkbox('colors[]', $color->id) }} 
{{ $color->name }}` 
Run Code Online (Sandbox Code Playgroud)

{{ Form::checkbox('colors[]', $color->id, $checked) }}
{{ $color->name }}
Run Code Online (Sandbox Code Playgroud)

问题2:实际上有一个完美的方法给你.使用

$door->colors()->sync(Input::get('colors'));
Run Code Online (Sandbox Code Playgroud)

它将删除旧的并一次性添加所有新的.