【发布时间】:2021-12-26 12:40:49
【问题描述】:
我正在 Laravel 中创建一个在线书店,创建新书后,管理员可以通过选中特定的仓库复选框来定义哪些仓库可以存放这本书。 为了深入了解它的工作原理,这是我的创建函数:
public function create()
{
$authors = Author::all();
$selectedAuthor = Book::first()->author_id;
$publishers = Publisher::all();
$selectedPublisher = Book::first()->publisher_id;
$warehouses = Warehouse::all();
$selectedWarehouse = Book::first()->warehouse_id;
return view('books.create', compact(['authors', 'publishers', 'warehouses'],
['selectedAuthor', 'selectedPublisher', 'selectedWarehouse']
));
}
还有我的存储方法:
public function store(Request $request)
{
$request->validate([
'ISBN' => 'required',
'author_id' => 'required',
'publisher_id' => 'required',
'year' => 'required',
'title' => 'required',
'price' => 'required',
]);
try {
$book = Book::create($request->all());
foreach ($request->checked as $value){
$book->warehouses()->attach([$value]);
}
return redirect()->route('books.index')
->with('success','Book created successfully.');
} catch (\Illuminate\Database\QueryException $e) {
var_dump($e->errorInfo);
}
}
但是当管理员编辑一本书时,创建该书时选中的复选框应该是“选中”,并且管理员应该能够附加更多的仓库,并且能够“取消选择”一个仓库,所以如果一个已经检查过的值被取消检查和提交,它应该从多对多表中分离出来。
这是我目前拥有的: 我的编辑方法:
public function edit(Book $book)
{
$authors = Author::all();
$selectedAuthor = Book::first()->author_id;
$publishers = Publisher::all();
$selectedPublisher = Book::first()->publisher_id;
$warehouses = Warehouse::all();
$selectedWarehouse = Book::first()->warehouse_id;
return view('books.edit', compact(['book', 'authors', 'publishers', 'warehouses'],
['selectedAuthor', 'selectedPublisher', 'selectedWarehouse']));
}
还有我的更新方法:
public function update(Request $request, Book $book)
{
$request->validate([
'ISBN' => 'required',
'publisher_id' => 'required',
'author_id' => 'required',
'year' => 'required',
'title' => 'required',
'price' => 'required',
]);
try {
$book->update($request->all());
// TODO: Update warehouses
return redirect()->route('books.index')
->with('success','Book updated successfully.');
} catch (\Illuminate\Database\QueryException $e) {
var_dump($e->errorInfo);
}
}
还有我的 edit.blade 视图中的复选框:
@foreach($warehouses as $warehouse)
<input type="checkbox" name="checked[]" value="{{ $warehouse->id }}">
{{ $warehouse->address }}
<br/>
@endforeach
我的书模型:
public function warehouses()
{
return $this->belongsToMany(Warehouse::class);
}
还有我的仓库模型:
public function books()
{
return $this->belongsToMany(Book::class);
}
任何关于在编辑现有书籍时能够附加/分离的帮助,将不胜感激!
【问题讨论】:
-
你试过sync()函数吗?
标签: laravel eloquent laravel-blade