【问题标题】:How to solve integrity constraint violation in Laravel 5.7?如何解决 Laravel 5.7 中违反完整性约束的问题?
【发布时间】:2019-08-18 15:43:09
【问题描述】:

我收到以下错误:SQLSTATE[23000]:完整性约束违规:1048 列'user_id'不能为空(SQL:插入answersbodyuser_idquestion_id,@987654325 @,created_at)

我正在尝试使用 Laravel 向表单提交答案,但出现上述错误。首先,我在答案表中检查了我的架构,并且正确定义了 user_id:

public function up()
{
    Schema::create('answers', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedInteger('question_id');
        $table->unsignedInteger('user_id');
        $table->text('body');
        $table->integer('votes_count')->default(0);
        $table->timestamps();
    });
}

接下来,我将此代码添加到我的 AnswersController.php 以验证代码并在提交答案后重定向:

public function store(Question $question, Request $request)
{    
    $request->validate([
        'body' => 'required'
    ]);

    $question->answers()->create(['body' => $request->body, 'user_id' => \Auth::id()]);

    return back()->with('success', "Your answer has been submitted successfully");
}

我将 Answer 类导入到我的 AnswersController.php 中,并将 body 和 user_id 字段设置为 Answer.php 模型中的可填充字段:

protected $fillable = ['body', 'user_id'];

当我单击表单上的提交按钮时,我收到上面显示的 SQL 状态错误。 user_id 是我的数据库答案表中的有效字段。我好像搞不懂。

【问题讨论】:

    标签: laravel laravel-5.7


    【解决方案1】:

    您的代码看起来不错。但是错误非常简单:您没有得到user_id。 IE 您正在尝试创建一个答案支点,调用 user_id 从非对象创建。 \Auth::id() 为空或无法识别您想要的。改为调用用户对象。

    试试这个:

    $question->answers()->create(['body' => $request->body, 'user_id' => \Auth::user()->id]);
    

    还要确保您确实有一个用户:通过带有 auth 中间件的路由将表单发回:

    Route::group(['middleware' => ['auth']], function () {
       Route::resource('questions.answers', 'AnswersController');
       // Any other routes where you want a user
    }
    

    【讨论】:

    • 嗨,Watercayman,我使用了你的代码 sn-p,当我运行代码时,我现在收到此错误:“尝试获取非对象的属性 'id'”
    • 这是一个好兆头 - 它显示了问题。这种形式是通过(路由)正常的 Laravel auth 中间件进入的吗?如果没有,您将不会有用户,因此会出现错误。我将编辑我的答案以提供帮助
    • 不知道你的意思是“这个表格是通过(路由)进来的 - 对不起,我是 laravel 的新手。但我的 web.php 中有这条路线:Route::resource('questions .answers', 'AnswersController')->except(['index', 'create', 'show']);
    • 没问题-确保该路由在您的身份验证中间件中-查看编辑后的答案-另外-如果您没有“创建”内部,那将是一个问题-需要创建
    • 我把上面的Route::group代码放在哪个文件里?
    猜你喜欢
    • 2019-04-12
    • 2020-01-31
    • 2016-08-11
    • 1970-01-01
    • 2019-01-02
    • 2017-09-11
    • 2020-06-14
    • 2016-05-25
    相关资源
    最近更新 更多