我有一个Laravel 5.2后端和Angular 1前端应用程序。他们使用REST API进行通信。有一段代码可以在每次页面加载时更新一些数据库数据(该应用程序是一个浏览器游戏,因此在这种情况下,玩家的资源和单位正在更新/生成),但我遇到了一些问题。
在某些情况下,前端会同时请求多个API端点。如果自上次请求后生成了新单元,则Entity
应attached()
Player
模式(多对多关系)。实际情况是,所有3个请求都会尝试附加新的Entity
,并最终在SQL error: duplicate key
表格中使用pivot
(不是确切的措辞)。
问题不是与Eloquent隔离的,例如3个API请求同时导致生成3个报告消息等等。
解决此问题的最佳方法是什么?到目前为止,我已经尝试用DB::transaction
包装DB语句,但这似乎没有解决问题(或者我做错了)。
感谢您提供任何有用的回复。
答案 0 :(得分:0)
根据L5.2 source code attach
似乎每次运行时都会将记录插入数据透视表中。
其中一个解决方案可能是将attach
替换为syncWithoutDetaching([entity_id])
。
然而,在角度应用程序中限制单个请求的数量会更好。
答案 1 :(得分:0)
最后,我最终创建了一个在后台永远运行的Laravel命令:
while(true) {
updateUnitsExample();
$this->info('Units updated for time '. date("H:m:s"));
sleep(1);
}