Laravel中store方法绑定请求模型:关联已有作者存储书籍
问题解答
你的需求完全可以实现,但当前的路由和控制器代码存在几处错误,调整后就能完成书籍与作者的关联存储,具体修改如下:
路由部分
你的路由写法没问题,不需要改动:
Route::post('/store', [BookController::class, 'store'])->name('book.store');
控制器修正
现有代码的问题
- 方法参数里的
Author $author_id属于多余配置,作者ID是从表单下拉框的请求参数获取,不需要通过路由注入 - 验证规则里的
book_id是错误的,应该对应下拉框的author_id字段 - 缺少对作者ID有效性的验证,建议增加
exists规则确保提交的ID在authors表中存在
修正后的控制器代码
public function store(Request $request) { $validated = $request->validate([ 'title' => 'required', 'year' => 'required', 'author_id' => 'required|exists:authors,id' ]); Book::create($validated); return redirect()->route('book.index'); }
模型配置(必须)
要让create()方法正常批量赋值,需要在Book模型中设置可填充字段:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; class Book extends Model { use HasFactory; protected $fillable = ['title', 'year', 'author_id']; // 定义与作者的关联关系(可选,但建议加上) public function author() { return $this->belongsTo(Author::class); } }
表单注意事项
确保下拉框的name属性为author_id,选项值使用作者的ID:
<select name="author_id" required> @foreach($authors as $author) <option value="{{ $author->id }}">{{ $author->name }}</option> @endforeach </select>
内容的提问来源于stack exchange,提问作者Arne
相关产品推荐
相关产品推荐

