lockForUpdate Laravel 5.1之后不存在方法保存

时间:2017-03-03 04:41:57

标签: laravel laravel-5 laravel-5.1

Laravel在悲观锁定后无法将数据保存到数据库

我在使用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;
    }
}

错误显示在我的编辑器中

enter image description here

我的浏览器中显示

错误

enter image description here

我的表格

enter image description here

3 个答案:

答案 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....
}

我想这会解决你的问题。