Хранение вычисляемых полей в базе данных - Laravel 5.7 - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующие таблицы в моем проекте laravel

users
profiles
fitness_reports

Каждый профиль принадлежит пользователю, а каждый фитнес-отчет принадлежит профилю.Пользователь может иметь один профиль и несколько фитнес-отчетов, связанных через идентификатор профиля.Это необходимо для показа пользователям еженедельных отчетов.

Таблица профилей содержит столбцы, такие как 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 голосов
/ 04 октября 2018

Вы хотите создать новый 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

0 голосов
/ 04 октября 2018

Вы можете попробовать что-то вроде этого:

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.');
}

... или что-то подобное, где вам нужно сохранить отчет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...