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

Posted

技术标签:

【中文标题】如何从不同的表中减去两个整数值【英文标题】:How to subtract two integer values from different tables 【发布时间】:2019-05-02 06:52:04 【问题描述】:

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


例如

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

我的用户想将一些死亡率放入循环 id 1 ,所以他/她进入死亡率模式。

用户输入日期,属于循环id 1日期范围。 number_of_mortality的值为25。用户输入数据后,点击添加提交到数据库。

提交后,cycle id 1的population值会减少,应该是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 减去人口来减少代码强>。你能帮助我吗?谢谢

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】:

您可以使用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;

【讨论】:

先生,这段代码是做什么的? 'cycle_id' =&gt; optional($cycle)-&gt;id ?? 0, 它使用cycle_id0。可选的助手在那里,所以如果循环为空,它不会抛出异常。 docs @Peejong 请参阅here 了解更多信息 @Remul 你能编辑答案吗? $start = Carbon::parse($value-&gt;date_start_raise); 应该是 $start = Carbon::parse($cycle-&gt;date_start_raise); @Peejong 我更新了我的代码,它现在应该可以为你工作了。

以上是关于如何从不同的表中减去两个整数值的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库中的两个不同表中减去?

Laravel - 从不同的表中获取总和并计算

从sql中的表中减去两个日期

如何使用触发器从两个不同的表中插入数据

如何从两个不同的、不相关的表中获取最新的行,并将它们合并到一个结果集中?

如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER