Php Laravel8:SQLSTATE[23000]:完整性约束冲突:1048列';标题';不能为空
我正在与Laravel 8合作,我制作了一个简单的表单,如下所示: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> <
<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-inarticles
(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');
});