![](/img/trans.png)
[英]Laravel 6 - SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
[英]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_5
。votes
,CONSTRAINTvotes
votes_post_id_foreign
FOREIGN KEY(post_id
),參考posts
(id
))(SQL:插入votes
(value
,user_id
,updated_at
,created_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.