我的upvote / downvote系统非常困难。 ajax执行成功函数但是laravel没有在数据库中插入任何内容..我不知道我做错了什么。我的AJAX:
$('[data-value]').on('click', function () {
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
var $this = $(this);
var post_id = $this.data('id');
var votetype = $this.data('value');
$.ajax({
type:"POST",
url:'/post/' + post_id + '/vote/' + votetype,
success:vote(post_id,votetype)
});
// vote(post_id,votetype);
});
我的路线:
Route::post('/post/{id}/vote/{vote}', 'PostController@vote');
我的laravel投票功能:
public function vote($id,$vote)
{
//TODO: refactor this..
$username = Session::get('username');
$id = Post::find($id);
$uservote = PostVotes::where('id',$id)->where('username',$username)->first();
if($uservote->count())
{
$votetype = $uservote->vote;
if($votetype === $vote)
{
$uservote->delete();
} else {
Vote::updateOrCreate(
['vote' => $votetype],
['vote' => $vote]
);
}
} else {
$uservote = new PostVotes;
$uservote->vote = $vote;
$uservote->username = $username;
$uservote->id = $id;
$uservote->save();
}
}
我不知道这是否有必要,但这是我的迁移
class CreatePostVotesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('post_votes', function (Blueprint $table) {
$table->integer('id');
$table->string('username',50);
$table->integer('vote');
});
}
}
class CreatePostsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id')->unique;
$table->string('title',80);
$table->string('username',50);
$table->integer('score');
$table->timestamp('created_at');
$table->string('image',512);
});
}
}
关系:(Post.php):
public function votes()
{
//Quick note: Id refers to the post id.
return $this->hasMany(PostVotes::class,'id');
}
PostVotes.php:
public function post()
{
return $this->belongsTo(Post::class,'id');
}
答案 0 :(得分:2)
我确定其中一个问题在这里:
$id = Post::find($id);
/*
* you are passing instance of the Post model or null into where('id', $id)
* predicate, instead of the id of the post
*/
$uservote = PostVotes::where('id',$id)->where('username',$username)->first();
您可以尝试更改此内容:
$post = Post::find($id);
$uservote = PostVotes::where([
'id' => $post->id,
'username' => $username,
])
->first();
因为您正在将模型的实例Post
(或null
,如果Post::find($id)
未返回任何内容)传递到您的条件而不是帖子id
属性。
<强>增加:强>
在使用$uservote
之前,您应该检查$uservote
:
$uservote = PostVotes::where([
'id' => $post->id,
'username' => $username,
])
->first();
// $uservote is empty, you should create new instance of the PostVotes model
if( empty($uservote)){
}
如果此$id
是帖子的ID,您也可以传递vote
这是您的函数id
的参数。
$uservote = PostVotes::where([
'id' => $id, // <-- use $id, if $id is the post id
'username' => $username,
])
->first();
如果您想将帖子的ID存储到您的投票模型中,可能您应该更改此信息:
$uservote->id = $id;
关于这个:
$uservote->id = $post->id;
在接受我的代码建议后,$post = Post::find($id);
顺便说一句,为了更好的可读性,如果您希望在此属性中使用帖子的商店ID,则应将模型id
的{{1}}属性重命名为Vote
。通常,名称为post_id
的字段用作具有自动增量属性的表主键。
另请查看id
文件,您可以在其中找到有关错误的更多信息。
添加#2
你应该得到这样的东西:
/storage/logs/laravel.log
答案 1 :(得分:0)
仅在数据成功插入数据库后才从服务器返回OK。
服务器可以返回OK但数据实际上并未插入数据库。 jquery成功函数将在不实现系统预期的情况下执行