我在使用Laravel 5.1的保存方法时遇到无法将数据更新到db的问题。
我正在尝试使用锁定来更新数据以避免并发数据,下面是我的代码。
请帮帮我。
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;
}
}
错误显示在我的编辑器中
我的浏览器中显示错误
我的表格
答案 0 :(得分:1)
即使->get()
中只有一条记录,Collection
方法也会始终返回Collection
。
如果你知道你的where子句只是为了返回一条记录,或者你只关心它返回的第一条记录,那么只需将->get()
更改为->first()
即可设置$concur_up
}到Recharge
模型实例而不是Collection
。
答案 1 :(得分:1)
我根据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;
}
}
答案 2 :(得分:0)
您正在扩展模型但不在代码中使用模型。尝试在标头中添加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....
}
我想这会解决你的问题。