如何避免重复的记录进行插入

Pra*_*ahu 1 php laravel eloquent laravel-5.6

我正在使用Laravel 5.6.29

if ( CharmFlag::where('post_id', '=', $postId)->where('charm_id', '=', $charm_id)->get()->isEmpty() ) {
      CharmFlag::create([
          'post_id' => $postId,
          'charm_id' => $charm_id,
          'gif_flag' => $gif_flag
      ]);
  } else {
      $charmFlag = CharmFlag::where('post_id', '=', $postId)->where('charm_id', '=', $charm_id)->first();
          $charmFlag->gif_flag = $gif_flag;
          $charmFlag->save();
     }
Run Code Online (Sandbox Code Playgroud)

但是在数据库中我可以看到类似的记录 在此处输入图片说明

现在可以看到有重复的记录charm_id=18604charm_id=18605,但据我所编码的,它不应该发生的。

更新资料

还将代码更改为

$charmFlag = CharmFlag::firstOrNew(['post_id' => $postId, 'charm_id' => $charm_id]);
$charmFlag->gif_flag = $gif_flag;
$charmFlag->save();
Run Code Online (Sandbox Code Playgroud)

但仍然会得到重复的条目。

有趣的事实是对于每个重复的记录,时间戳也相同。对于所有这些情况,也只有第二条记录。

移民

Schema::create('charm_flags', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('post_id');
    $table->unsignedInteger('charm_id');
    $table->boolean('gif_flag')->default(0);

    $table->timestamps();
    $table->foreign('post_id')->references('post_id')->on('posts');
    $table->foreign('charm_id')->references('charm_id')->on('base_charms');
});
Run Code Online (Sandbox Code Playgroud)

更新2

变成

CharmFlag::updateOrCreate(
          ['post_id' => $postId, 'charm_id' => $charm_id],
          [
              'gif_flag' => $gif_flag,
          ]
 );
Run Code Online (Sandbox Code Playgroud)

但仍然得到重复的记录。

Set*_*thu 7

您不需要检查isEmpty,可以使用firstOrNew()updateOrCreate()方法

$charmFlag = CharmFlag::firstOrNew(['post_id' => $postId, 'charm_id' => $charm_id]);
$charmFlag->gif_flag = $gif_flag;
$charmFlag->save();
Run Code Online (Sandbox Code Playgroud)

要么

$charmFlag = CharmFlag::updateOrCreate(['post_id' => $postId, 'charm_id' => $charm_id]);
$charmFlag->gif_flag = $gif_flag;
$charmFlag->save();
Run Code Online (Sandbox Code Playgroud)

请检查文档 https://laravel.com/docs/5.3/eloquent#insert-update-delete


Pra*_*ahu 2

发布的答案都不适合我,所以基于评论的建议

  1. 删除了所有重复的条目

DELETE FROM harm_flags WHERE id IN (SELECT * FROM (SELECT MAX(n.id) FROM harm_flags n GROUP BY post_id, harm_id HAVING COUNT(*) > 1) x)

  1. 生成新的迁移来修改harm_flags表

Schema::table('harm_flags', function (Blueprint $table) { $table->unique(["post_id", "harm_id"]); });

如果有更好的解决方案,我想学习。