将计算的字段存储在数据库中-Laravel 5.7

时间:2018-10-03 21:19:51

标签: laravel laravel-5.7

我的laravel项目中有以下表格

users
profiles
fitness_reports

每个个人资料都属于一个用户,每个健康报告都属于一个个人资料。用户可以通过一个个人资料ID拥有一个个人资料和多个健康报告。这是为了向用户显示每周报告。

“个人档案”表具有诸如user_id,dob,年龄,身高,体重,腰围,臀部,颈部,运动水平之类的列,这些列由用户输入并正确存储在个人档案表中。效果很好。

fitness_reports表具有诸如profile_id,“ bmi”,“ bmr”,“ bai”,“ weight_status”,“ fat_us”,“ fat_bmi”,“ fat_mass”,“ lean_mass”,“ fat_category”之类的列。所有这些字段都是已计算字段,只要个人档案表中有更新,就需要自动计算。

以前,我只有一个模型,其计算字段在以下条件下可以很好地工作

public function getBmiAttribute() {
    return ($this->weight / ($this->height * $this->height));
}

,然后使用控制器代码将其保存在相同的配置文件模型中

public function store(Request $request)
  {
      $profile = new Profile();
      $profile->weight = $request->get('weight');
      $profile->height = $request->get('height');
      $profile->dob = $request->get('dob');
      $profile->age;
      $profile->bmi;
      $profile->save();
      return back()->with('success', 'Your profile has been updated.');
  }

但是现在我们已经创建了一个单独的Fitness_reports表来跟踪每周报告。在这种情况下该如何做。

我已经尝试过了

use App\Models\Profile;

class FitnessReport extends Model
{
  .....

  public function getBmiAttribute($value)
   {
    return ($this->weight / ($this->height * $this->height));
   }
}

但这不起作用。什么都得不到保存。每当用户更新个人资料中的当前信息时,如何保存其他报告。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

class Profile extends Model
{
    // since this is really a function of the profile data
    public function getBmiAttribute()
    {
        return ($this->weight / ($this->height * $this->height));
    }
}

然后,当您存储FitnessReport:

public function store(Request $request)
{
    $profile = Auth::user()->profile;
    $report = new FitnessReport();
    $report->bmi = $profile->bmi;
    $report->save();
    return back()->with('success', 'Fitness report saved.');
}

...或您需要保存报告的任何类似位置。

答案 1 :(得分:0)

您想在每次Fitness Report更新时创建一个新的Profile 因此,您可以使用event handlers中的Eloquent Models

将事件处理程序设置为Prfile Model updated事件,以保存新的Fitness Report

class Profile extends Model
{
    protected static function boot()
    {
        parent::boot(); // TODO: Change the autogenerated stub

        parent::updated(function ($profile) {

            FitnessReport::create([
                'profile_id' => $profile->id,
                'bmi' => $profile->weight / ( $profile->height * $profile->height ),
                ...
                ... // other necessary fields
            ]);

        });
    }

    // relationship to fitness reports.
    public function fitnessReports()
    {
        return this->hasMany(FitnessReport::class);
    }
}

这种情况在您创建新模型时一直存在。和bmi将自动设置为模型并保存。

尝试使用updating event

做同样的事情