方法保存在 lockForUpdate Laravel 5.1 之后不存在
Method save does not exist occur after lockForUpdate Laravel 5.1
Laravel悲观锁后无法将数据保存到数据库
我遇到了在 Laravel 5.1 中使用保存方法时无法将数据更新到数据库的问题。
我正在尝试使用锁定更新数据以避免并发数据,下面是我的代码。
请帮帮我。
namespace App\Model;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
class Recharge extends Model
{
public function processSuccess($orderId, $type, $amount) {
$query = [
['status', '<=', 1],
['order_abm', '=', $orderId],
['type', '=', $type],
['amount', '=', $amount],
];
\DB::beginTransaction();
$concur_up = Recharge::where($query)->lockForUpdate()->get();
$concur_up->status = 5;
$concur_up->amounted = $amount;
$concur_up->date = time();
$res =$concur_up->save();
if (!$res) {
return "fail";
}
\DB::commit();
return true;
}
}
我的编辑器中显示错误
我的浏览器中显示错误
我使用table
您正在扩展模型但未在代码中使用该模型。尝试在 header 中添加 use Illuminate\Database\Eloquent\Model;
。所以你的代码将是这样的:
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
class Recharge extends Model
{
// Your code....
}
我想这会解决您的问题。
->get()
方法总是return一个Collection
,即使那个Collection
.
中只有一条记录
如果您知道您的 where 子句只针对 return 一条记录,或者您只关心第一条记录 returns,那么只需将 ->get()
更改为 ->first()
,这会将 $concur_up
设置为 Recharge
模型实例而不是 Collection
.
我根据 Mr.Patricus 上面的答案编辑了我的代码并且
它在将 ->get()
更改为 ->first()
后立即起作用。
这是我的代码。谢谢大家的指教。
class Recharge extends Model
{
public function processSuccess($orderId, $type, $amount) {
$query = [
['status', '<=', 1],
['order_abm', '=', $orderId],
['type', '=', $type],
['amount', '=', $amount],
];
\DB::beginTransaction();
$concur_up = Recharge::where($query)->lockForUpdate()->first();
$concur_up->status = 5;
$concur_up->amounted = $amount;
$concur_up->date = time();
$res =$concur_up->save();
if (!$res) {
return "fail";
}
\DB::commit();
return true;
}
}
Laravel悲观锁后无法将数据保存到数据库
我遇到了在 Laravel 5.1 中使用保存方法时无法将数据更新到数据库的问题。
我正在尝试使用锁定更新数据以避免并发数据,下面是我的代码。
请帮帮我。
namespace App\Model;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
class Recharge extends Model
{
public function processSuccess($orderId, $type, $amount) {
$query = [
['status', '<=', 1],
['order_abm', '=', $orderId],
['type', '=', $type],
['amount', '=', $amount],
];
\DB::beginTransaction();
$concur_up = Recharge::where($query)->lockForUpdate()->get();
$concur_up->status = 5;
$concur_up->amounted = $amount;
$concur_up->date = time();
$res =$concur_up->save();
if (!$res) {
return "fail";
}
\DB::commit();
return true;
}
}
我的编辑器中显示错误
我的浏览器中显示错误
我使用table
您正在扩展模型但未在代码中使用该模型。尝试在 header 中添加 use Illuminate\Database\Eloquent\Model;
。所以你的代码将是这样的:
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
class Recharge extends Model
{
// Your code....
}
我想这会解决您的问题。
->get()
方法总是return一个Collection
,即使那个Collection
.
如果您知道您的 where 子句只针对 return 一条记录,或者您只关心第一条记录 returns,那么只需将 ->get()
更改为 ->first()
,这会将 $concur_up
设置为 Recharge
模型实例而不是 Collection
.
我根据 Mr.Patricus 上面的答案编辑了我的代码并且
它在将 ->get()
更改为 ->first()
后立即起作用。
这是我的代码。谢谢大家的指教。
class Recharge extends Model
{
public function processSuccess($orderId, $type, $amount) {
$query = [
['status', '<=', 1],
['order_abm', '=', $orderId],
['type', '=', $type],
['amount', '=', $amount],
];
\DB::beginTransaction();
$concur_up = Recharge::where($query)->lockForUpdate()->first();
$concur_up->status = 5;
$concur_up->amounted = $amount;
$concur_up->date = time();
$res =$concur_up->save();
if (!$res) {
return "fail";
}
\DB::commit();
return true;
}
}