如何从不同的表中减去两个整数值

时间:2018-11-30 06:00:18

标签: php database laravel eloquent laravel-query-builder

如何通过使用population表中number_of_mortality的值减去总体来减少周期表中mortalities的值?


例如

周期表中有2个数据
ID 1 -(日期范围为9月3日至9月28日)人口= 3000
ID 2 -(日期范围为10月1日至11月5日)人口= 9000

cycles table

我的用户想将多个死亡率纳入 id 1 周期,因此他/她进入了死亡率模态。

mortality modal

用户输入日期,它属于周期 id 1 日期范围。 number_of_mortality的值为25。用户输入数据后,他/她单击添加以提交到数据库。

提交后,第1个周期的人口数将减少,应该为8975(9000-25 = 8975)。


这是我的控制器

MortalityController.php(存储)

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减去代码来减少代码的位置人口。你能帮助我吗?谢谢

MoralalityController.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());

    }

MoralalityController.php(销毁)

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

1 个答案:

答案 0 :(得分:1)

您可以使用decrement()方法。

成功创建死亡率后,您可以减少周期中的人口:

商店:

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;
}