更新数据透视表并保留旧值

时间:2019-05-22 13:58:50

标签: laravel-5

我正在Laravel 5.8中为一个项目工作,我需要在数据透视表上进行更新,并保留不更新的值。

这是我的课堂日历:

class Calendar extends Model {

public function users() {
    return $this->belongsToMany('App\Models\User')->withPivot('display', 'all_rights', 'color', 'rgbCode');
    }
}

这是我的班级用户

class User extends Model {
public function calendars() {
    return $this->belongsToMany('App\Models\Calendar')->withPivot('display', 'all_rights', 'color', 'rgbCode');
    }
}

所有用户都可以拥有各种活动的日历。创建日历时,我将用户分配到不同的列表中,以使其成为管理员或简单用户:

public function create(Request $request)
{
    $calendar = new Calendar();
    $calendar->name = $request->input('name');
    $calendar->save();
    $calendar->users()->attach($request->input('users'), ['color' => $color->name, 'rgbCode' => $color->rgbCode]);
    $calendar->users()->attach($request->input('administrators'), ['all_rights' => 1,'color' => $color->name, 'rgbCode' => $color->rgbCode]);
}

在创建时,所有日历都设置为 display:null 。用户稍后可以切换显示。

问题是,当我想更新日历(名称或允许的人)时,同步实际上并没有达到我想要的效果:

public function update(Request $request)
{
    $calendar = Calendar::find($request->input('id'));
    $calendar->name = $request->input('name');
    $calendar->update();

    $calendar->users()->sync($request->input('users'));
    $calendar->users()->sync($request->input('administrators'), ['all_rights' => 1]);
}

如果我不同步数组中的精确值,它将作为默认值,所以 null 。对于$calendar->users()->sync($request->input('users'));中的 all_rights 值也可以,因为我需要将其设置为null,但是对于显示来说,这是有问题的,因为用户可能会因为同事更改了一个值而感到恼火日历中的设置,他必须对其进行更新才能再次查看。

所以我的问题是:是否可以使用sync()进行大量更新,并保留旧值(如果存在)?

0 个答案:

没有答案