【问题标题】:Laravel isDirty method mass assignmentLaravel isDirty 方法批量赋值
【发布时间】:2019-11-04 18:17:25
【问题描述】:

如果被 isDirty() 方法更改,我的代码只会保存一个 field(efirst) 的数据,并且它工作正常。如果我有十个字段而不写每个字段名,如何获得相同的结果?

控制器:

public function update(TeacherRequest $request, $id)
{
    $teacher = Teacher::find($id);
    $teacher->efirst = $request->efirst;

    if ($teacher->isDirty()) {
        $new_data = $teacher->efirst;
        $old_data = $teacher->getOriginal('efirst');

        if ($teacher->save()) {
            $teacher->update($request->except('qual_id', 'id', 'profile_pic'));

            DB::table('teacher_logs')->insert(
                [
                    'user_id' => $user->id,
                    'teacher_id' => $teacher->id,
                    'old_value' => $old_data,
                    'new_value' => $new_data,
                ]);
        }
    }
}

【问题讨论】:

  • 你在说什么结果?
  • @lagbox 我想检查是否有任何字段被更改。
  • isDirty 就是这样做的,检查模型的属性是否被修改
  • @lagbox 我这样做是为了检查上面代码中的一个字段,如果我有 5 个字段,我该怎么做?我将不得不输入每个?
  • 你知道什么是批量赋值吗?并不是说粗鲁,只是在这里计算一些基线

标签: laravel laravel-6


【解决方案1】:

如果不想多次写$teacher->field = $request->value;,可以使用循环:

foreach($request->except("_token") AS $field => $value){
  $teacher->{$field} = $value;
}

if($teacher->isDirty()){
  $new_data = [];
  $old_data = [];
  foreach($request->except("_token") AS $field => $value){
    $new_data[$field] = $value;
    $old_data[$field] = $teacher->getOriginal($field);
  }
}

注意:您需要将 $new_data$old_data 转换为数组,以便正确引用每个字段和值,并在要处理的 teacher_logs 表的插入上执行一些额外的逻辑,但这应该给你一个想法。

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 2023-04-01
    • 2022-08-22
    • 2019-07-16
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2011-07-13
    • 2015-06-13
    相关资源
    最近更新 更多