【发布时间】:2018-03-13 17:33:51
【问题描述】:
我有简单的 Laravel 上传、插入/更新。
我有将 csv 文件上传到我的目录的 ajax..
$.ajax({
url:'uploadExcel',
data: new FormData($("#uploadForm")[0]),
headers: {
'X-CSRF-TOKEN' : $('meta[name="_token"]').attr('content')
},
// dataType:'json',
async: true,
type:'post',
cache: false,
processData: false,
contentType: false,
success: function(){
//chunk data from CSV
},
error: function(data){
var errors = data.responseJSON;
console.log(errors);
},
complete:function(completeData){
console.log(completeData);
}
});
成功后,我将 csv 中的数据分块。它使用link 成功分块,现在我使用DB::transaction(function() {}); 插入数据库。但现在我想使用DB:COMMIT 和DB:ROLLBACK...
知道我该怎么做吗?
对于DB:COMMIT,我有一个提交最后一个事务的按钮。
对于DB:ROLLBACK,我有一个按钮可以回滚上次事务中的所有内容。
注意:我正在为此做 ajax,但它不起作用。
更新:我是手动的。
我有beginTransaction的函数
DB::beginTransaction();
foreach($results as $row){
$item = new items;
$selectQuery = DB::table('items')
->where('title', '=', $row["1"])
->where('description', '=', $row["2"])
->get();
if (count($selectQuery) > 0) {
// update
DB::table('items')
->where('title', '=', $row["1"])
->where('description', '=', $row["2"])
->update([
"title" => $row["1"],
"description" => $row["2"]
]);
} else {
//insert
$item->title = $row["1"];
$item->description = $row["2"];
$item->save();
}
}
我的控制器中的第二个函数是DB::commit();,第三个函数是DB:rollback();。
此方法不保存 csv 中的任何数据,并且回滚和提交不起作用。有什么想法吗?
【问题讨论】:
-
你不应该把它包装在
try-catch中吗?将DB::beginTransaction()和DB::commit()放在try 块中,将DB::rollback()放在catch 块中。为什么要有回滚和提交按钮? -
@Doom5 因为我希望第一个检查 csv 中的数据是否正确,为此我希望第一个将其保存到数据库并为 commit() 和 rollback() 提供 2 个单独的按钮
-
那么你应该先验证它,然后再将它保存到数据库中。此外,您似乎正在执行更新或插入保存模式。
-
Offtopic,但无论如何选择要更新的行是不好的做法,并且会降低性能。只需 $updated = DB::table...->update(...);如果没有更新行,则插入。
-
@AiXEn 你能确认你的函数是否抛出任何错误吗?