Laravel 5.6带有更改器重置计数器的自定义ID每天

时间:2019-01-23 10:52:48

标签: php laravel-5

我使用增变器为记录创建自定义ID,使其看起来像这样:

yyyy-mm-dd- {sequence}

序列看起来像这样

00001
00002
...

所以它是5位数字,只是一个计数器。

我有2个问题

1)我不知道如何在增变器中创建计数器,我可以执行for循环,但是现在我不知道如何在明天以后进行重置的无限​​循环。

2)老实说,我不知道如何每天重置它。

我的变种人

public function setFunctionalIdAttribute($id)
{
    $date = Carbon::now()->format("Y-m-d");

    // I take an extremely large number here because there will never be so much records in 1 day.
    for ($counter = 0; $counter <= 100000000000; $counter++) {
        $counter = str_pad($counter, 5, '0', STR_PAD_LEFT);
    }

    $today = Carbon::today();
    $tomorrow = Carbon::tomorrow();

    if ($today = $tomorrow) {
        $counter = 0;
    }

    $this->attributes['functional_id'] = $date . "-" . $counter;
}

3 个答案:

答案 0 :(得分:1)

很难说,但是,以最好的方式,您的计数器循环实际上没有任何意义,对不起!我建议您完全摆脱它,或者至少阅读str_pad上的PHP文档。

您还有一条条件语句,该语句检查“今天是明天明天”。对我来说,这是一个很大的危险信号,通常来说,逻辑是不正确的。

让我们考虑一下替代方案。您实际上是在计算一天中的记录数,以将其用作ID。我建议一种类似的方法:

public function setFunctionalIdAttribute()
{
  // 1. Count how many records there are from today
  // 2. Make an ID that is this number + 1
  // 3. If need be, string pad left with 0's
}

1。计算今天有多少记录

Laravel具有方便的whereDate函数– from the docs(搜索whereDate

$count = DB::table('users')
                ->whereDate('created_at', Carbon::today()->toDateString())
                ->count();

因此,如果我们今天有3条记录,那么$count将是3。

2。请输入一个ID + 1

$count ++;

3。如有必要,请在字符串填充符的左边加上0

str_pad上的PHP文档非常糟糕,只介绍基础知识即可:

str_pad($input, $length, $pad_string, $pad_type);
  • $input是您要填充的字符串
  • $length是字符串的最后长度(这就是为什么您的for循环完全没有必要的原因)
  • $pad_string如果字符串长度小于$length,请用此填充剩余的空间
  • 如您所愿,
  • $pad_type是向左滑动的可选标志

您的$input$count,您的$length是5,从您的示例来看,$pad_string是“ 0”,我们保留PAD_LEFT

$id = str_pad($count, 5, "0", PAD_LEFT)

我不记得如何通过mutator设置属性,所以只需复制您的示例(我希望这是正确的!),我们得到:

public function setFunctionalIdAttribute()
{
  $count = DB::table('users') // Remember to change this to the correct table name
    ->whereDate('created_at', Carbon::today()->toDateString())
    ->count();
  $count ++;
  $id = str_pad($count, 5, PAD_LEFT)
  $this->attributes['functional_id'] = $id;
}

请记住仅在创建时执行此操作,因为我们不想在每次保存时都递增此ID。

答案 1 :(得分:0)

我不知道您的代码的用途,但是由于您在循环外使用$counter变量,因此这总是会将“ functional_id”设置为“ 2019-01-23-100000000001”

您的循环不做任何事情就循环了。 (如果您不希望有超过100000个条目,为什么还要循环到如此高的数量呢?!?)

您需要的是先前设置的计数器,即DB或其他地方的et​​her,但是像这样,您的代码将无法工作。 这样,您可以执行一些检查,例如 if ($dateOfLastEntry != Carbon::now()->format('Y-m-d')) {$counter = 1} 否则设置$counterOfLastEntry +1 不使用您正在使用的可怕的for循环 最后执行了str_pad

也许您可以向我们提供更多信息,说明它应该如何工作,将要使用该计数器的内容以及该数据的存储位置。

答案 2 :(得分:0)

我知道这是一个古老的问题,但是对于以后几天需要类似事物的每个人,我都做出了解决该问题的事情。

 public function Counter()
    {
        $today =  Carbon::today();
        $today_files = Shipment::whereDate('created_at', $today)->count();
        $counter=  $today_files;

        if ($today_files != 0) {
            $counter++;
        } else {
            $counter = 1;
        }
        return counter;
    }```