Как вычесть два целых значения из разных таблиц - PullRequest
0 голосов
/ 30 ноября 2018

Как можно уменьшить значение population в таблице циклов, используя значение number_of_mortality в таблице mortalities для вычитания населения?


Например,

иметь 2 таблицы данных в циклах
Id 1 - (диапазон дат с 3 сентября по 28 сентября) Население = 3000
Id 2 - (диапазон дат с 1 октября поНоябрь 5) Население = 9000

cycles table

I пользователь хочет поместить число смертности в цикл id 1 ,поэтому он / она переходит в режим смертности.

mortality modal

Пользователь вводит дату, и она относится к циклу id 1 dateспектр.Значение number_of_mortality равно 25. После ввода данных пользователем он / она нажимает кнопку «Добавить» для отправки в базу данных.

После отправки значение совокупности идентификатора цикла 1 будет уменьшено, и оно должно быть8975 (9000 - 25 = 8975).


Это мой контроллер

MortalityController.php (store)

public function store(Request $request)
{
    $this->validate($request, array(
        'date_input' => 'required|date',
        'number_of_mortality' => 'required|numeric',
    ));

    $cycle = Cycle::select('id', 'date_start_raise')
        ->where('date_start_raise','<=',$request->get('date_input'))
        ->where('date_end_raise','>=',$request->get('date_input'))
        ->get();

    $id = 0;
    $chickenAge = 0;
    $input= Carbon::parse($request->get('date_input'));

    foreach($cycle as $value){
        $id = $value->id;
    }

    if ($id) {
        $start = Carbon::parse($value->date_start_raise);
        $chickenAge = $start->diffInDays($input) ;
    }

    return Mortality::create([
        'date_input' => request('date_input'),
        'number_of_mortality' => request('number_of_mortality'),
        'chicken_age' => $chickenAge,
        'cause_of_death' => request('cause_of_death'),
        'cycle_id' => $id,
        'user_id' => Auth::id()
    ]);
}

Я понял, каксоедините таблицу mortalities с таблицей cycles, используя даты, но Я не знаю, как и где можно поместить код в порядке убывания, используя number_of_mortality для вычитания населения .Вы можете мне помочь?Спасибо

MortalityController.php (обновление)

  public function update(Request $request, $id)
    {
        $mortality = Mortality::findOrFail($id);
                //validate
                $this->validate($request, array(
                    'date_input' => 'required|date',
                    'number_of_mortality' => 'required|numeric',
                    ) );

        $mortality->update($request->all());

    }

MortalityController.php (Уничтожить)

public function destroy($id)
    {
        $mortality = Mortality::findOrFail($id);
        $mortality->delete();
    }

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете использовать метод decment () .

После успешного создания смертности вы можете уменьшить численность населения в цикле:

Store:

public function store(Request $request)
{
    $this->validate($request, array(
        'date_input' => 'required|date',
        'number_of_mortality' => 'required|numeric',
    ));

    // Make sure you only get the correct cycle here
    $cycle = Cycle::where('date_start_raise', '<=', $request->get('date_input'))
        ->where('date_end_raise', '>=', $request->get('date_input'))
        ->first(); 

    $chickenAge = 0;
    $input= Carbon::parse($request->get('date_input'));

    if ($cycle) {
        $start = Carbon::parse($cycle->date_start_raise);
        $chickenAge = $start->diffInDays($input) ;
    }

    $mortality = Mortality::create([
        'date_input' => request('date_input'),
        'number_of_mortality' => request('number_of_mortality'),
        'chicken_age' => $chickenAge,
        'cause_of_death' => request('cause_of_death'),
        'cycle_id' => $cycle->id ?? 0,
        'user_id' => Auth::id()
    ]);

    // decrement population after successfully creating the mortality
    if ($cycle) {
        $cycle->decrement('population', $mortality->number_of_mortality);
    }

    return mortality;
}

Обновление:

public function update(Request $request, $id)
{
    $this->validate($request, array(
        'date_input' => 'required|date',
        'number_of_mortality' => 'required|numeric',
    ));

    $mortality = Mortality::findOrFail($id);

    $oldNumberOfMortality = $mortality->number_of_mortality;

    // fill the model with the new attributes
    $mortality->fill($request->all());

    // check if number_of_mortality was changed
    if ($mortality->isDirty('number_of_mortality')) {
        $cycle = $mortality->cycle;
        $difference = $oldNumberOfMortality - $mortality->number_of_mortality;

        // check if the difference is positive or negative and increment or decrement
        if ($difference < 0) {
            $cycle->decrement('population', abs($difference));
        } elseif ($difference > 0) {
            $cycle->increment('population', $difference);
        }
    }

    $mortality->save();

    return mortality;
}
...