我正在使用AJAX在Laravel 5中构建一个upvote / downvote系统。 我也使用这个jquery插件来显示投票按钮:https://github.com/janosgyerik/jquery-upvote
但我一直收到这个错误。它似乎也完全忽略了post_id
字段(由于我的关系?)而且它没有从value
字段中的按钮提交任何值。
SQLSTATE [23000]:完整性约束违规:1452无法添加或 更新子行:外键约束失败 (
laravel_5
。votes
,CONSTRAINTvotes_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:参数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);
}
}
});
});
});
答案 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请求发送正确的数据。