SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值
Posted
技术标签:
【中文标题】SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值【英文标题】:SQLSTATE[HY000]: General error: 1364 Field 'title' doesn't have a default value 【发布时间】:2019-11-10 11:18:43 【问题描述】:您好,我正在尝试将数据插入数据库,但它说:
SQLSTATE[HY000]:一般错误:1364 字段“标题”没有 默认值(SQL:插入
projects
(owner_id
,updated_at
,created_at
) 值 (1, 2019-06-28 13:17:11, 2019-06-28 13:17:11))
我关注Laracasts Laravel from scratch tutorial
控制器:
public function store()
$attributes = $this->validateProject();
$attributes['owner_id'] = auth()->id();
$project = Project::create($attributes);
//Project::create($attributes);
//Project::create(request(['title', 'description']));
Mail::to($project->owner->email)->send(
new ProjectCreated($project)
);
return redirect('/projects');
型号:
protected $guarded = [];
表:
Schema::create('projects', function (Blueprint $table)
$table->increments('id');
$table->unsignedInteger('owner_id');
$table->string('title');
$table->text('description');
$table->timestamps();
$table->foreign('owner_id')->references('id')->on('users')->onDelete('cascade');
);
刀片文件:
<form method="POST" action="/projects">
@csrf
<div class="field">
<label class="label" for="title">Title</label>
<div class="control">
<input type="text" class="input $errors->has('title') ? 'is-danger' : ''" name="title" value=" old('title') " placeholder="Project title">
</div>
</div>
<div class="field">
<label class="label" for="title">Description</label>
<div class="control">
<textarea name="description" class="textarea $errors->has('description') ? 'is-danger' : ''" placeholder="Project description"> old('description') </textarea>
</div>
</div>
<div class="field">
<div class="control">
<button type="submit" class="button is-link">Create Project</button>
</div>
</div>
@include('errors')
</form>
如何解决这个问题
【问题讨论】:
你能添加你的 validateProject() 函数吗? 我在底部添加了一个新功能,这里是完整的控制器 paste.ofcode.org/htHYYDkYnKhgux6azDKtVh – 当你dd($request->all());
在 Controller 存储函数中时,你会得到什么?
同样的错误
在store函数的store函数的第一行。
【参考方案1】:
您在projects
表中有字段title
,但是您没有为其分配值。因为它设置为Not Nullable
,所以会出现这个错误。
当使用您似乎没有的Project::create($attributes);
时,您需要所有属性都在模型的$fillable
属性中。
$fillable
的一个例子是:
protected $fillable = [
'title',
'description',
'owner_id',
];
还有其他几个潜在的原因,但是如果没有您包括完整的 Project
模型和此请求来自的视图,则无法判断。
编辑
您需要将您的功能更改为:
public function store(ProjectRequest $request)
$attributes = $request->all();
$attributes['owner_id'] = auth()->id();
$project = Project::create($attributes);
Mail::to($project->owner->email)->send(
new ProjectCreated($project)
);
return redirect('/projects');
您可以通过运行 php artisan make:request ProjectRequest
创建 ProjectRequest
类,然后将您的验证规则放入其中。
阅读更多here。
【讨论】:
@programmer0001 表结构是什么,您在请求中传递了什么? @programmer0001 我已经用正确的$fillable
更新了我的答案。看看有没有用?
在 laracasts 系列 laracasts.com/series/laravel-from-scratch-2018/episodes/30?autoplay=true 之后没有同样的错误 m
@programmer0001 $this->validateProject();
函数是什么?
我在底部添加了一个新功能是完整的控制器 paste.ofcode.org/htHYYDkYnKhgux6azDKtVh【参考方案2】:
在您的模型中像这样在fillable
中添加您的列名(我猜您的模型名称是Project.php
)
所以你的模型类应该是这样的。
<?php
mnamespace App;
use Illuminate\Database\Eloquent\Model;
class Project extends Model
protected $guarded = [];
protected $fillable = [
'title', 'owner_id','description'
];
public function owner()
return $this->belongsTo(User::class);
public function tasks()
return $this->hasMany(Task::class);
public function addTask($task)
$this->tasks()->create($task);
然后像这样更新您的 controller
store
方法。
public function store(Request $request)
$attributes = $this->validateProject();
$attributes->owner_id = auth()->id();
$attributes->title = $this->request->title;
$attributes->description= $this->request->description;
$project = Project::create($attributes);
Mail::to($project->owner->email)->send(
new ProjectCreated($project)
);
return redirect('/projects');
【讨论】:
未定义属性:App\Http\Controllers\ProjectsController::$request 在namespace
之后的控制器顶部有use Illuminate\Http\Request;
这一行吗?
是完整的控制器:paste.ofcode.org/htHYYDkYnKhgux6azDKtVh
请使用我更新的store
方法。我已经更新了store
方法中的代码
让我们continue this discussion in chat。【参考方案3】:
错误本身是不言自明的,请检查此代码:
$attributes['owner_id'] = auth()->id();
$project = Project::create($attributes);
在这里,您正在项目表中创建一条新记录,为此您只使用一列,即owner_id
,但在表中有一个列title
,它没有默认值。
因此,要么在创建新记录时获取所有列,要么为这些列提供默认值(null 或其他值)。
在迁移中将null
设置为默认值:
$table->string('title')->nullable();
或者你可以直接更改数据库中的列并将其默认值设置为null,见下面的截图:
【讨论】:
我是 laravel 的新手,第一次关注 laracasts 系列,你能告诉我我应该做什么的代码【参考方案4】:无法追踪您所面临的问题。试试这个代码,如果你有任何问题,请评论。
在你的路由文件中
Route::post('project', 'ProjectController@store')->name('project.store');
在您的创建视图中
<form method="POST" action="route('project.store')">
@csrf
<div class="field">
<label class="label" for="title">Title</label>
<div class="control">
<input type="text" class="input $errors->has('title') ? 'is-danger' : ''" name="title"
value=" old('title') " placeholder="Project title">
</div>
</div>
...
<div class="field">
<div class="control">
<button type="submit" class="button is-link">Create Project</button>
</div>
</div>
@include('errors')
</form>
在您的项目控制器中
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
class UserController extends Controller
public function store(Request $request)
$this->validate($request, [
'title' => 'required|max:255',
]);
$post = Post::create([
'title' => $request->title,
'owner_id' => auth()->id()
]);
return redirect('/projects');
编辑 1
在您之前在 ProjectsController 中的代码中,尝试使用而不是使用 $attributes
public function store()
$project = Project::create([
'title' => request('title'),
'owner_id' => request('owner_id')
]);
Mail::to($project->owner->email)->send(
new ProjectCreated($project)
);
return redirect('/projects');
编辑 2
不要使用create方法,试试这个
public function store()
$project = new Project();
$project->title = request('title');
$project->owner_id = request('owner_id');
$project->save();
...
【讨论】:
Class App\Http\Controllers\ProjectController 不存在我的控制器名称是 ProjectsController 是的,将 ProjectController 替换为 ProjectsController 奇怪。使用 request('title') 后出现同样的错误? 我也做过 php artisan migrate:fresh 但实际上问题出在控制器中因为最初它可以工作,但经过一些更改后它无法正常工作,我已经将代码与该视频匹配了两次,但同样的错误 404 抱歉,找不到您要查找的页面。以上是关于SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [HY000]:一般错误:1364 字段“标题”没有默认值
PDO 错误:SQLSTATE [HY000]:一般错误:2031
SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005