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:插入projectsowner_idupdated_atcreated_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-&gt;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-&gt;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 字段“标题”没有默认值

SQLSTATE [HY000]:一般错误:2053

PDO 错误:SQLSTATE [HY000]:一般错误:2031

SQLSTATE[HY000]:一般错误:在 Laravel 中迁移期间出现 1005

SQLSTATE [HY000]:一般错误:1364 字段 'uID' 没有默认值

SQLSTATE[HY000]:一般错误:1366 整数值不正确: