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 请求发送正确的数据。
我正在使用 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
, CONSTRAINTvotes_post_id_foreign
FOREIGN KEY (post_id
) REFERENCESposts
(id
)) (SQL: insert intovotes
(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 请求发送正确的数据。