使用laravel php-mysql在一段时间内仅更改一次字段值

时间:2016-09-12 00:04:18

标签: php mysql laravel

我有一个包含timestamp等属性的表格,此表格包含有关发票的字段,当用户在第一次输入invoice值作为不正确的表单时,我想在期间内只更改一次发票内的值添加项目后的时间24 hours !!我希望阻止他在发票超出24 hours时进行任何更改,我使用laravel framework

2 个答案:

答案 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)

您可以采用不同的方法来执行此业务规则:

  1. 如果您的应用程序中的所有更新都通过Http发生,那么您可以在控制器中处理它
  2. 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)
        }
        // ...
    }
    
    1. 您还可以通过监听updating事件使模型本身强制执行此规则,并在更新期限到期时返回false,这将阻止保存模型的更改。
    2. 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);
              });
          }
          // ...
      }
      
      1. 如果您必须选择哪些属性可以或不能更新,您可以为每个受保护的属性实现单独的mutator,并在更新期限到期时抛出异常。

      2. 根据您使用的数据库,您可以使用触发器处理数据库级别。