【问题标题】:SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value, LaravelSQLSTATE [HY000]:一般错误:1364 字段“名称”没有默认值,Laravel
【发布时间】:2019-05-06 02:33:36
【问题描述】:

您好,我是 API 制作和使用的新手,我使用 Laravel 作为 api 部分,并使用 angular 的 HttpClient 发出请求,这是代码

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';


@Injectable()
export class ApitestProvider {
  tests;
  apiUrl = "http://127.0.0.1:8000/api";
  testAdded;
  testGotten;
  testDeleted;
  constructor(public http: HttpClient) {

    console.log('Hello ApitestProvider Provider');
  }

  addTest(data) {
    /*let nData= JSON.stringify(data);
    console.log(nData);*/
    let obj = {name : "test"};
    this.http.post(this.apiUrl + "/tests",JSON.stringify(obj))
      .subscribe(res => {
        console.log(res);
        this.testAdded = res;
      }, (err) => {
        console.log(err);
      });
  }

为了测试目的而修改的代码,这是我的控制器的 laravel 代码

public function store(Request $request){
    return Testme::create($request->all());
}

这是初始迁移的代码

class CreateTestmesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('testmes', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('testmes');
    }
}

同样在模型中唯一可填写的是“姓名”,提前致谢。

【问题讨论】:

  • 尝试调试结果,在store()函数的第一行添加dd($request->all());
  • 不好,我应该在哪里看到结果
  • 浏览器中的开发者工具。您是如何发现错误的?
  • 我刚刚做了,似乎它阻止了消息,显示此跨域请求被阻止:同源策略不允许读取127.0.0.1:8000/api/tests 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)
  • 打开您的 app/middlware/kernal.php 文件并注释掉这一行:\App\Http\Middleware\VerifyCsrfToken::class 仅出于测试目的这样做。

标签: mysql laravel api post ionic-framework


【解决方案1】:

我发现了问题,我只需要在我发送的请求中设置数据格式的标头

只需要使用 httpheaders

  addTest(data) {
    let headers = new HttpHeaders();
    headers = headers.set('Content-Type', 'application/json; charset=utf-8');
    let nData = JSON.stringify(data);
    console.log(nData)
    this.http.post(this.apiUrl + "/tests", nData, {headers: headers})
      .subscribe(res => {
        console.log(res);
        this.testAdded = res;
      }, (err) => {
        console.log(err);
      });
  }

【讨论】:

    【解决方案2】:

    错误提示:“字段名称没有默认值”。 这意味着您不会在发布请求中为此字段发送任何值。 所以你有三种方式:

    1 -> 用客户端http请求中的值填写名称字段

    2 -> 在 laravel 应用程序中进入数据库用户的迁移,并为 name 字段设置一个默认值,如下所示:$table->string('name')->default('');

    3 -> 转到 2° 点的同一个文件并将名称字段设置为可空,如下所示:$table->string('name')->nullable();

    【讨论】:

    • 这就是问题所在,在1中,你可以看到我在post请求中发送了“name”值,为什么api没有得到它?
    • 检查模型内的批量分配属性并尝试使用 $request->name 或只插入 DB::table('testmes')->insert([ “name” => $request ->名称]);
    猜你喜欢
    • 2018-06-07
    • 2018-10-19
    • 2020-09-12
    • 1970-01-01
    • 2020-05-25
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多