Laravel 5: SQLSTATE[23000]: 违反完整性约束,外键约束失败

Laravel 5: SQLSTATE[23000]: Integrity constraint violation, foreign key constraint fails

我正在使用 AJAX 在 Laravel 5 中构建一个 upvote/downvote 系统。 我也在使用这个 jquery 插件来显示投票按钮:https://github.com/janosgyerik/jquery-upvote

但是我一直收到这个错误。它还似乎完全忽略了 post_id 字段(由于我的关系?)并且它没有从 value 字段中的按钮提交任何值。

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (laravel_5.votes, CONSTRAINT votes_post_id_foreign FOREIGN KEY (post_id) REFERENCES posts (id)) (SQL: insert into votes (value, user_id, updated_at, created_at) values (, 2, 2015-09-14 22:02:11, 2015-09-14 22:02:11))

我尝试了一些方法,首先我使用 save() 而不是像这样 create()

Auth::user()->votes()->save($request->all());

但这又导致了另一个错误

ErrorException in HasOneOrMany.php line 210: Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() must be an instance of Illuminate\Database\Eloquent\Model, array given, called in C:\xampp\htdocs\laravel-5\app\Http\Controllers\VotesController.php on line 63 and defined

即使我在控制器中包含 Illuminate\Database\Eloquent\Model

我也试过用这个代替

App\User::find(Auth::user()->id)->votes()->save($request->all());

但我得到了 Class 'App\Http\Controllers\App\User' not found,即使我包含了 App\User

代码量较大,请多多包涵。

迁移文件

public function up()
    {
        Schema::create('votes', function(Blueprint $table) {
            $table->increments('id');
            $table->integer('value');
            $table->integer('user_id')->unsigned();
            $table->integer('post_id')->unsigned();
            $table->timestamps();

            $table->foreign('user_id')
                    ->references('id')
                    ->on('users');

            $table->foreign('post_id')
                ->references('id')
                ->on('posts');
        });
    }

路线

Route::resource('votes', 'VotesController');

VotesController.php

public function store(Requests\VoteRequest $request)
    {
        // AJAX JSON RESPONSE
        $response = array(
            'status' => 'success',
            'msg' => 'Article has been posted. Redirecting now.',
        );

        if(Auth::check()){
            \Log::info(Auth::user());
            Auth::user()->votes()->create($request->all());
        } else {
                return \Response::json('Nope');
        }

        return \Response::json($response);
    }

Vote.php 型号

class Vote extends Model
{
    protected $fillable = [
        'value'
    ];

    protected $primaryKey = 'post_id';

    public function user() {
        return $this->belongsTo('App\User');
    }

    public function posts() {
        return $this->belongsTo('App\Post');
    }
}

User.php 型号

public function votes() {
        return $this->hasMany('App\Vote');
    }

Post.php 型号

public function votes() {
        return $this->hasMany('App\Vote');
    }

视图的相关部分:show.blade.php

{!! Form::open(['url' => 'votes', 'id' => 'votes']) !!}
    <div class="upvote topic">
      <a class="upvote" data-value="1" id="value"></a>
         <span class="count">0</span>
         <a class="downvote" data-value="-1" id="value"></a>
    </div>
{!! Form::close() !!}

Javascript

$(document).ready(function() {
            $('.topic').upvote();

            $('#votes').on('click', function (e) {
                e.preventDefault();
                var value = $('#value').val();
                $.ajaxSetup({
                    headers: {
                        'X-CSRF-TOKEN': $('[name="_token"]').val()
                    }
                });
                $.ajax({
                    type: "POST",
                    url: 'http://localhost/laravel-5/public/votes',
                    dataType: 'JSON',
                    data: {value: value},
                    success: function( data ) {

                        //console.log(data);

                        if(data.status == 'success') {
                            alert(data.msg);

                        } else {
                            alert('error');
                            console.log(data.msg);
                        }
                    }
                });
            });
        });

你这里有一大堆问题。让我们暂时关注前端的东西。您在多个地方使用相同的 HTML ID,该 ID 无效并导致您读取错误的元素,您在应该使用 .data('value') 检索时使用 .val()来自元素的数据,并且 post_id 似乎不在您的代码中的任何位置,并且绝对不包含在您的 ajax 请求中。

从 show.blade.php

开始
{!! Form::open(['url' => 'votes', 'class' => 'votes']) !!}
<div class="topic" data-post="{{ $post->id }}">
  <a class="upvote vote" data-value="1"></a>
  <span class="count">0</span>
  <a class="downvote vote" data-value="-1"></a>
</div>
{!! Form::close() !!}

假设您在该视图中有一个可用的 $post 对象。否则,您需要从某处获取 post_id 才能将其包含在此处。现在在你的 Javascript:

$('.topic').upvote();

$('.vote').on('click', function (e) {
  e.preventDefault();
  var data = {value: $(this).data('value'), post_id: $(this).parent().data('post')};
  $.ajaxSetup({
    headers: {
      'X-CSRF-TOKEN': $('[name="_token"]').val()
    }
  });
  $.ajax({
    type: "POST",
    url: 'http://localhost/laravel-5/public/votes',
    dataType: 'JSON',
    data: data
  });
});

这至少应该让您的 POST 请求发送正确的数据。