簡體   English   中英

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]:違反完整性約束:1452無法添加或更新子行:外鍵約束失敗( laravel_5votes ,CONSTRAINT votes votes_post_id_foreign FOREIGN KEY( post_id ),參考postsid ))(SQL:插入votesvalueuser_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:傳遞給Illuminate \\ Database \\ Eloquent \\ Relations \\ HasOneOrMany :: save()的參數1必須是Illuminate \\ Database \\ Eloquent \\ Model的實例,給定數組,在C:\\ xampp \\ htdocs中調用第63行的\\ laravel-5 \\ app \\ Http \\ Controllers \\ VotesController.php並已定義

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

我也嘗試過使用它

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

但是即使我包含App\\User Class 'App\\Http\\Controllers\\App\\User' not found

涉及到一些代碼,請耐心等待。

遷移檔案

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,這是無效的,並導致您讀取錯誤的元素;當應使用.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請求發送正確的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM