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


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

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

但我总是犯这个错误。它似乎完全忽略了post_id字段(由于我的关系?(,并且没有提交value字段中按钮的任何值。

SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(laravel_5.votes,约束votes_post_id_foreign外键(post_id(参考posts(id(((SQL:插入votes(valueuser_idupdated_atcreated_at(值(,2,2015-09-14 22:02:112015-09-14 22:02:11((

我尝试了几件事,首先我使用了save(),而不是像那样使用create()

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

但这又出现了一个错误

HasOneOrMany.php第210行出现ErrorException:参数1传递给Illuminate''Database''Eloquent''Relations''HasOneOrMany::save((必须是Illuminate''Database''Eloquent''Model的实例,给定数组,在中调用C: ''examplep''htdocs''laravel-5''app''Http''Controllers''VotesController.php打开第63行和定义的

尽管我在控制器中包含了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,这是无效的,并导致您读取了错误的元素,您使用了.val((,而您应该使用.data('value'(从元素中检索数据,并且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请求发送正确的数据。