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=18604和charm_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)
但仍然得到重复的记录。
您不需要检查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
发布的答案都不适合我,所以基于评论的建议
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)
Schema::table('harm_flags', function (Blueprint $table) { $table->unique(["post_id", "harm_id"]); });
如果有更好的解决方案,我想学习。
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |