[英]Many-to-Many Eloquent relationship update with Laravel Form Model Binding & Checkboxes
我有3張桌子:
門
顏色
door_colors
和2個具有多對多關系的模型(每扇門有多種顏色,許多顏色與門到門重疊):
門模型
class Door extends Eloquent {
public function colors()
{
return $this->belongsToMany('Color', 'door_colors');
}
}
顏色模型
class Color extends Eloquent {
public function doors()
{
return $this->belongsToMany('Door', 'door_colors');
}
}
我想創建一個表單,我可以編輯門,並通過復選框更新可用的顏色。 這是我的管理員門控制器
class AdminDoorsController extends AdminController {
public function edit($id)
{
$data['door'] = Door::find($id);
$data['colors'] = Color::all();
return View::make('admin/doors/form', $data);
}
}
和管理員窗體視圖
{{ Form::model($door) }}
Colors:
@foreach ($colors as $color)
{{ Form::checkbox('colors[]', $color->id) }} {{ $color->name }}
@endforeach
{{ Form::close() }}
問題1:如何進行設置,以便在輸出復選框時,檢查與當前門存在關系的復選框,並取消選中未關聯的復選框。
問題2:一旦我勾選方框並點擊提交,我將如何更新關系? $door->colors()->detach();
要清除此門的所有現有門,然后$door->colors()->attach($color_id_array);
基於一系列顏色ID創建新的?
任何輸入都表示贊賞!
問題1:您應該將其傳遞到包含表單的視圖中,盡管它也可以在視圖中正確顯示,盡管這不是最佳實踐。 做類似的事......
$checkeds = Door::find(1)->colors()->lists('id');
...你發現的門是正在更新的門。 然后在循環中輸出復選框之前,添加
$checked = in_array($color->id, $checkeds) ? true : false;
然后你會改變
{{ Form::checkbox('colors[]', $color->id) }}
{{ $color->name }}`
至
{{ Form::checkbox('colors[]', $color->id, $checked) }}
{{ $color->name }}
問題2 :實際上有一個完美的方法給你。 使用
$door->colors()->sync(Input::get('colors'));
它將刪除舊的並一次性添加所有新的。
假設您正在為用戶和角色建模,並希望編輯具有角色的用戶。
在您的控制器編輯中,
$user = User::find($id);
$roles = Role::lists('name', 'id'); // to populate all roles
在您的模板中,如果您使用select,
{{ Form::select('roles[]', $roles, array_pluck($user->roles, 'id'), ['multiple']) }}
在您的控制器更新中,
$inputs = Input::all();
$roles = $inputs['roles'];
$user->roles()->sync($roles);
// $user->fill($inputs);
// $user->save();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.