Laravel:如何通过updateOrCreate

时间:2019-02-15 23:02:33

标签: laravel

我要在数据库中更新或创建 但我想获取旧值和更新后的值,因为我想在这两个值之间进行比较

例如

表用户中的此项

name = Alex and Order = 10

所以现在我想更新此人

name = Alex and Order = 8

现在更新或创建后(如果不存在)

仅用于我想要的更新

Old order 10 | And new Order 8

我想在这两个订单之间进行比较

我有tryin getChange() getOriginal(),但是两个函数给了我新的价值。

请帮助

3 个答案:

答案 0 :(得分:1)

如果已经加载了对象,则可以使用getOriginal获得旧值。

例如:

$user = User::find(1);

$user->first_name = 'newname';

// Dumps `oldname`
dd($user->getOriginal('first_name'));
$user->save();

但是对于updateOrCreate,您只需要数据。我不确定使用updateOrCreate的方法,但是您可以简单地做到:

$user = User::where('name', 'Alex')->first();
$newOrder = 10;

if($user){
    $oldOrder = $user->getOriginal('order');
    $user->order = $newOrder;
    $user->save();
}

答案 1 :(得分:0)

表中的名称是否唯一?因为如果不是这样,您将在具有相同数据的多行上进行更新。

所以最好的方法是使用唯一列,它可能是ID。

User::updateOrCreate(
    [ 'id' => $request->get('id') ], // if the $id is null, it will create new row
    [ 'name' => $request->get('name'), 'order' => $request->get('order') ]
);

答案 2 :(得分:0)

解决方案

            $model = Trend::where('name', $trend->name)->first();

        if ($model) {
            $model->old_order = $model->getOriginal('order');
            $model->order = $key + 1;
            $model->save();
        } else {
            Trend::where('order', $key + 1)->delete();
            $new = new Trend();
            $new->name = $trend->name;
            $new->old_order = $key + 1;
            $new->order = $key + 1;
            $new->tweet_volume = $trend->tweet_volume;
            $new->save();
        }