You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:35:18