当时间戳设置为false时,可以以更好的方式更新laravel模型中的时间戳

时间:2019-02-23 11:14:11

标签: laravel

我已将三个模型的时间戳设置为false,以免更新updated_at列。 现在我的更新功能需要更新这三个模型。我写了如下功能。我觉得可以用更好的方法来完成。谁能帮我这个忙。

我想用同样的功能做到这一点。

   public function update(
      BoxItemUpdateRequest $request,
      ModelA $modelA ,
      ModelB $modelB ,
      ModelC $modelC
   ) {
      $modelA->decrement(
         'total', 
          $request->quantity1- $request->quantity2
      );
      $modelA->timestamps = true;
      $modelA->touch();
      $modelA->save();
      $modelB->decrement(
        'total',
        $request->quantity1- $request->quantity2
      );
      $modelB->timestamps = true;
      $modelB->touch();
      $modelB->save();
      $modelC->quantity_accepted = $request->quantity2;
      $modelC->timestamps = false;
      $modelC->touch();
      $modelC->save();

      return Response::json([
        'status' => HttpStatusCode::HTTP_OK,
      ]);
   }

谢谢。

2 个答案:

答案 0 :(得分:1)

也许有更好的解决方案,但是您可以为此创建一个trait,从而为save()方法或模型添加更多逻辑。

特征可能如下:

use Carbon;

trait DoesNotTouchTimestamps // Maybe not the best name
{    
    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * Save the model to the database.
     *
     * @param  array  $options
     * @return bool
     */
    public function save(array $options = [])
    {
        if (data_get($options, 'touch_updated_at', false)) {
            $this->updated_at = new Carbon;
        }

        return parent::save($options);
    }
}

将其导入您的模型中

use DoesNotTouchTimestamps;

class ModelA
{
    use DoesNotTouchTimestamps;
}

然后调用您的保存方式:

$modelA->save([
    'touch_updated_at' => true,
]);

答案 1 :(得分:0)

  

默认情况下,Eloquent希望您的表上存在created_at和Updated_at列。如果您不希望Eloquent自动管理这些列,请将模型上的$ timestamps属性设置为false

这意味着,如果要禁用时间戳,您仍然可以使用非常基本的方式手动为其分配值。将timestamps属性的值切换为truefalse并不是一个好方法。

为什么不简单使用$modelB->updated_at = Carbon::now();?由于您已经告诉laravel您正在手动管理时间戳。如果有人尝试查看时间戳是如何手动更新的,这也有助于使代码可读性

您可以:

<?php 

public function update(BoxItemUpdateRequest $request, ModelA $modelA , ModelB $modelB , ModelC $modelC ) {

  $now = Carbon::now();
  $modelA->decrement('total', $request->quantity1- $request->quantity2);
  $modelA->created_at = $now;
  $modelA->updated_at = $now;
  $modelA->save();



  $modelB->decrement('total', $request->quantity1 - $request->quantity2);
  $modelB->created_at = $now;
  $modelB->updated_at = $now;
  $modelB->save();


  $modelC->quantity_accepted = $request->quantity2;
  $modelC->updated_at = $now;
  $modelC->save();

  return Response::json([
    'status' => HttpStatusCode::HTTP_OK,
  ]);
}