我正在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
(value
,user_id
,updated_at
,created_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请求发送正确的数据。