我已将三个模型的时间戳设置为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,
]);
}
谢谢。
答案 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
属性的值切换为true
或false
并不是一个好方法。
为什么不简单使用$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,
]);
}