ajax成功但laravel没有插入数据库

时间:2017-03-25 08:16:55

标签: php jquery ajax laravel

我的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');
    }

2 个答案:

答案 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成功函数将在不实现系统预期的情况下执行