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

时间:2015-09-14 22:30:40

标签: php jquery ajax laravel laravel-5

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

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

  

SQLSTATE [23000]:完整性约束违规:1452无法添加或   更新子行:外键约束失败   (laravel_5votes,CONSTRAINT votes_post_id_foreign FOREIGN KEY   (post_id)参考postsid))(SQL:插入votes   (valueuser_idupdated_atcreated_at)值(,2,   2015-09-14 22:02:11,2015-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:\ xampp \ htdocs \ laravel-5 \ app \ Http \ Controllers \ VotesController.php on   第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');
    }

View的相关部分: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);
                        }
                    }
                });
            });
        });

1 个答案:

答案 0 :(得分:1)

你在这里遇到了很多问题。让我们暂时关注前端的东西。您在多个地方使用相同的HTML ID,这是无效的并导致您读取错误的元素,当您使用.data(&#39; value&#39;)检索数据时,您正在使用.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请求发送正确的数据。