我有一个包含timestamp
等属性的表格,此表格包含有关发票的字段,当用户在第一次输入invoice
值作为不正确的表单时,我想在期间内只更改一次发票内的值添加项目后的时间24 hours
!!我希望阻止他在发票超出24 hours
时进行任何更改,我使用laravel framework
答案 0 :(得分:0)
在您的发票模型中,您需要将受保护的$ timestamp设置为true;
然后,当创建或更新记录时,将自动填充created_at / updated at字段。
因此,在laravel中处理日期时间的附加功能是一个名为Carbon的库
正如tadman和Khalid在您的控制器中建议您可以这样做:
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use Invoice;
class FooInvoiceController extends Controller
{
/**
*
* Method to check if invoice is editable
*
* @param $invoiceId
* @return bool
*/
public function isInvoiceEditable($invoiceId)
{
$now = Carbon::now();
$invoiceCreatedAt = Invoice::where('id', $invoiceId)->get()->created_at;
$diffInHours = Carbon::parse($invoiceCreatedAt);
$length = $diffInHours->diffInHours($now);
if ($length > 24) {
return false;
}
return true;
}
/**
* @param $invoiceId
*/
public function fooAction($invoiceId)
{
if ($this->isInvoiceEditable($invoiceId)) {
// Work here
}
}
}
答案 1 :(得分:0)
您可以采用不同的方法来执行此业务规则:
class InvoiceController extends Controller
{
// ...
public function update($id, Request $request)
{
$invoice = Invoice::findOrFail($id);
abort_if($invoice->created_at < Carbon::now()->subHours(24),
422, "Updating is no longer available.");
// proceed as ussual (validate, save, fire events, etc)
}
// ...
}
updating
事件使模型本身强制执行此规则,并在更新期限到期时返回false
,这将阻止保存模型的更改。class Invoice extends Model
{
// ...
public static function boot()
{
parent::boot();
self::updating(function ($model) {
return $model->created_at !== null &&
$model->created_at >= Carbon::now()->subHours(24);
});
}
// ...
}
如果您必须选择哪些属性可以或不能更新,您可以为每个受保护的属性实现单独的mutator,并在更新期限到期时抛出异常。
根据您使用的数据库,您可以使用触发器处理数据库级别。