需要帮助才能摆脱杂草。我有一个Laravel应用程序,这个应用程序是从4.2开始的,我每隔几年就升级一次,每隔几年升级一次。我白天是.NET开发人员,但继续维护这个应用程序。不管怎样..。
我从Laravel6.x升级到8.x,并开始使用Docker。我把所有的东西都部署到我的生产环境中,而且大多数事情都在工作。我做了一些简单的测试,而且必须承认,我没有对所有的东西都进行测试,但是一些随机的代码部分实际上并没有将记录保存到数据库中。太奇怪了。我已经进行了几天的故障排除,这就是我现在遇到的问题:
8
您可能会对数据库之间的差异感到好奇,我使用的是M1 Mac,而且还没有对MySql Docker映像的M1支持。据我所知,Mariadb是一个插入式替代品。
这是我今晚写的代码,试图简化我在6-7年前写的一些非常古老的意大利面代码……现在也不比现在好,但请你对我放松点。最终,我只是从一个角度的前端进入4个数组,我正在迭代、创建/更新记录,然后将所有内容都传递回浏览器。
我不明白的是,它都表示保存,它在数据库中的表中增加了PKs,我用新分配的PKs返回了完整的模型.但它只是没有保存在数据库中。所有的失败都是完全无声的,我在vscode中使用xdebug调试时没有发现任何日志,也没有问题,没有sql日志,雄辩的模型说,无论是创建还是更新,它都是成功的。是的,似乎没有任何东西在存钱。
但我可以把所有完全相同的数据用修补程序运行,这样保存得很好.我真的很想知道我错过了什么。在我雄辩的模型类中,在400人对$primaryKey属性做出回应之前,我肯定已经检查了这一百万次(或者至少现在感觉是这样)。
/**
* Replaces UploadInvoice()
* Saves from editing an invoice.
*
* @param Request $request
*
* @return JsonResponse
*/
public function saveApiInvoice(Request $request): JsonResponse
{
$result = new OpResult();
DB::beginTransaction();
try {
$this->deletePendingInvoiceItems($request['pendingDeletes']);
$sales = $this->saveSaleRecords($request)->getData();
$overrides = $this->saveOverrideRecords($request)->getData();
$expenses = $this->saveExpenseRecords($request)->getData();
$payroll = $this->savePayrollInfo($request, $sales, $overrides, $expenses)->getData();
$this->paystubService->processPaystubJob($request['issueDate']);
return $result->setData([
'sales' => $sales,
'overrides' => $overrides,
'expenses' => $expenses,
'payroll' => $payroll
])->getResponse();
} catch (\Exception $ex) {
DB::rollBack();
return $result->setToFail($ex)
->getResponse();
}
}
private function savePayrollInfo($request, $sales, $overrides, $expenses)
{
$result = new OpResult();
$total = 0;
foreach ($sales as $sale) {
$total += $sale['amount'];
}
foreach ($overrides as $override) {
$total += $override['total'];
}
foreach ($expenses as $expense) {
$total += $expense['amount'];
}
$payroll = Payroll::agentId($request['agentid'])
->vendor($request['vendorId'])
->payDate($request['issueDate'])
->first();
if ($payroll != null) {
$payroll->amount = $total;
} else {
$agent = Employee::find($request['agentid']);
$payroll = new Payroll([
'agent_id' => $request['agentId'],
'agent_name' => $agent != null ? $agent->name : '',
'amount' => $total,
'is_paid' => false,
'vendor_id' => $request['vendorId'],
'pay_date' => $request['issueDate']
]);
}
$saved = $payroll->save();
return $result->setStatus($saved)
->setDataOnSuccess($payroll);
}
private function saveExpenseRecords($request)
{
$result = new OpResult();
$expenses = [];
foreach ($request['expenses'] as $e) {
$expense = new Expense([
'vendor_id' => $request['vendorId'],
'type' => $e['type'],
'notes' => $e['notes'],
'amount' => is_numeric($e['amount']) ? $e['amount'] + 0 : 0,
'agentid' => $request['agentId'],
'issue_date' => $request['issueDate'],
'wkending' => $request['weekending']
]);
$save_success = $expense->save();
if ($save_success) {
$expenses[] = $expense;
}
}
return $result->setDataOnSuccess($expenses);
}
private function saveOverrideRecords($request)
{
$result = new OpResult();
$overrides = [];
foreach ($request['overrides'] as $o) {
$override = new Override([
'vendor_id' => $request['vendorId'],
'name' => $o['name'],
'sales' => $o['sales'],
'commission' => is_numeric($o['commission']) ? $o['commission'] + 0 : 0,
'total' => is_numeric($o['total']) ? $o['total'] + 0 : 0,
'agentid' => $request['agentId'],
'issue_date' => $request['issueDate'],
'wkending' => $request['weekending']
]);
$save_success = $override->save();
if ($save_success) {
$overrides[] = $override;
}
}
return $result->setDataOnSuccess($overrides);
}
private function saveSaleRecords($request)
{
$result = new OpResult();
$sales = [];
foreach ($request['sales'] as $invoice) {
$sale = new Invoice([
'vendor' => $request['vendorId'],
'sale_date' => Carbon::parse($invoice['saleDate'])->format('Y-m-d'),
'first_name' => $invoice['firstName'],
'last_name' => $invoice['lastName'],
'address' => $invoice['address'],
'city' => $invoice['city'],
'status' => $invoice['status'],
'amount' => is_numeric($invoice['amount']) ? $invoice['amount'] + 0 : 0,
'agentid' => $request['agentId'],
'issue_date' => $request['issueDate'],
'wkending' => $request['weekending']
]);
$save_success = $sale->save();
if ($save_success) {
$sales[] = $sale;
}
}
return $result->setDataOnSuccess($sales);
}
private function deletePendingInvoiceItems($pending_deletes)
{
if (isset($pending_deletes['sales']) && count($pending_deletes['sales']) > 0) {
Invoice::destroy($pending_deletes['sales']);
$sales_ids = [];
foreach ($pending_deletes['sales'] as $key => $value) {
$sales_ids[] = $value['invoiceId'];
}
DB::table('invoices')->whereIn('invoice_id', $sales_ids)->delete();
}
if (isset($pending_deletes['overrides']) && count($pending_deletes['overrides']) > 0) {
$override_ids = [];
foreach ($pending_deletes['overrides'] as $key => $value) {
$override_ids[] = $value['overrideId'];
}
DB::table('overrides')->whereIn('ovrid', $override_ids)->delete();
}
if (isset($pending_deletes['expenses']) && count($pending_deletes['expenses']) > 0) {
$expense_ids = [];
foreach ($pending_deletes['expenses'] as $key => $value) {
$expense_ids[] = $value['expenseId'];
}
DB::table('expenses')->whereIn('expid', $expense_ids)->delete();
}
}```发布于 2022-01-18 05:52:05
在返回结果之前,您需要在DB::commit();函数中的try{}块末尾添加try{},从而提交DB事务。
public function saveApiInvoice(Request $request): JsonResponse
{
$result = new OpResult();
DB::beginTransaction();
try {
$this->deletePendingInvoiceItems($request['pendingDeletes']);
$sales = $this->saveSaleRecords($request)->getData();
$overrides = $this->saveOverrideRecords($request)->getData();
$expenses = $this->saveExpenseRecords($request)->getData();
$payroll = $this->savePayrollInfo($request, $sales, $overrides, $expenses)->getData();
$this->paystubService->processPaystubJob($request['issueDate']);
DB::commit(); // <--- Missing commit
return $result->setData([
'sales' => $sales,
'overrides' => $overrides,
'expenses' => $expenses,
'payroll' => $payroll
])->getResponse();
} catch (\Exception $ex) {
DB::rollBack();
return $result->setToFail($ex)
->getResponse();
}
}https://stackoverflow.com/questions/70750298
复制相似问题