Php Laravel8:SQLSTATE[23000]:完整性约束冲突:1048列';标题';不能为空

Php Laravel8:SQLSTATE[23000]:完整性约束冲突:1048列';标题';不能为空,php,mysql,laravel,laravel-8,Php,Mysql,Laravel,Laravel 8,我正在与Laravel 8合作,我制作了一个简单的表单,如下所示: <form action="/create" method="POST"> @csrf <label for="title">Title:</label> <input type="text" name="title"></br> <

我正在与Laravel 8合作,我制作了一个简单的表单,如下所示:

<form action="/create" method="POST">
    @csrf 
    <label for="title">Title:</label>
    <input type="text" name="title"></br>
    <label for="body">Body:</label>
    <textarea name="body" cols="30" rows="10"></textarea>
    <button>Send</button>
</form>
但我一提交表格,就会看到这样的信息:

照亮\数据库\查询异常 SQLSTATE[23000]:完整性约束冲突:1048列“title”不能为空(SQL:insert-in
articles
title
body
updated\u at
created\u at
)值(?,2020-10-27 07:36:472020-10-27 07:36:47))

我知道这意味着表中有一列不能为NULL。但正如您在代码中看到的,我确定了验证,因此,如果输入未填充,则应弹出所需消息,但不会弹出,并且再次出现错误消息

这也是表的迁移:

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}
所以如果你知道,我如何解决这个问题,请让我知道,我真的很感激


提前感谢。

如果手动创建验证程序实例,则必须自己处理失败的验证。您可以使用
$validator->fails()
检查验证是否失败。我会使用
$request->validate()
,这样Laravel会自动处理失败的验证

Route::post('/create',function(){
    $validator = Validator::make(request()->all(),[
        'title' => 'required',
        'body' => 'required'
    ]);
    Article::create([
        'title' => request()->input('title'),
        'body' => request()->input('body')
    ]);
    return redirect('/create');
});
:

如果您不想对请求使用
验证
方法,您可以 使用
验证程序
手动创建验证程序实例。这个 facade上的
make
方法生成一个新的验证器实例:

现在,我们已经准备好在
store
方法中填入
验证
新博客文章。为此,我们将使用验证
illighte\Http\Request
对象提供的方法。如果 验证规则通过后,您的代码将继续正常执行; 但是,如果验证失败,将引发异常,并且 正确的错误响应将自动发送回用户。在里面 对于传统HTTP请求,将使用重定向响应 生成,而将为AJAX请求发送JSON响应

因此,在您的情况下,它将是以下内容:

use Illuminate\Http\Request;
use App\Models\Article;

Route::post('/create', function (Request $request) {
    $validatedData = $request->validate([
        'title' => 'required',
        'body' => 'required',
    ]);

    Article::create($validatedData);

    return redirect('/create');
});

您正在创建一个验证器实例,但没有使用它验证数据

    $validator = Validator::make(request()->all(),[
        'title' => 'required',
        'body' => 'required'
    ]);
    
    // Validates request data. If fails redirect to /create
    if ($validator->fails()) {
        return redirect('/create')
            ->withErrors($validator)
            ->withInput();
     }
    // Validation passed, create article.
    Article::create([
        'title' => request()->input('title'),
        'body' => request()->input('body')
    ]);
    return redirect('/create');
还要了解如何在
/create
页面上显示错误消息。

请尝试以下操作:

Route::post('/create',function(){
$validateData = request()->validate([
'title' => 'required',
'body' => 'required',
]);
Article::create(request()->all());
return redirect('/create');
});

您需要在模型上指定
可填充的
受保护的
属性,因为默认情况下,所有有说服力的模型都可以防止质量分配

您可以在模型使用的特征中看到这一点:

trait-GuardsAttributes
{
/**
*质量可分配的属性。
*
*@var数组
*/
受保护的$fillable=[];
/**
*不可分配质量的属性。
*
*@var数组
*/
受保护的$guarded=['*'];
// ...
}
因此,您需要使字段可填充

类文章扩展了模型
{
受保护的$fillable=[
“头衔”,
"身体",,
];
}

尝试
dd(request()->all())
查看所有post参数是否存在
数组:3[▼   “_token”=>“WUPVBXBBAL1LXOROMRSQ5WEZH654TKNH2EWJZS”“title”=>null“body”=>null]
所以,这就是代码不起作用的原因。我的建议;1) 尝试不使用基于闭包的请求处理程序。使用控制器。那么为什么验证不起作用,所以用户必须填写表单2)使用
$request->validate()
,而不是创建新的验证程序。您是否在文章文件中编写了可填充功能?受保护的$filleble=['title','body'];验证程序::make($request->all(),['title'=>'required','body'=>'required',])->validate();请为你的答案添加一些解释,以便其他人可以从中学习。请为你的答案添加一些解释,以便其他人可以从中学习
use Illuminate\Http\Request;
use App\Models\Article;

Route::post('/create', function (Request $request) {
    $validatedData = $request->validate([
        'title' => 'required',
        'body' => 'required',
    ]);

    Article::create($validatedData);

    return redirect('/create');
});
    $validator = Validator::make(request()->all(),[
        'title' => 'required',
        'body' => 'required'
    ]);
    
    // Validates request data. If fails redirect to /create
    if ($validator->fails()) {
        return redirect('/create')
            ->withErrors($validator)
            ->withInput();
     }
    // Validation passed, create article.
    Article::create([
        'title' => request()->input('title'),
        'body' => request()->input('body')
    ]);
    return redirect('/create');
Route::post('/create',function(){
$validateData = request()->validate([
'title' => 'required',
'body' => 'required',
]);
Article::create(request()->all());
return redirect('/create');
});