我使用增变器为记录创建自定义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;
}
答案 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或其他地方的ether,但是像这样,您的代码将无法工作。
这样,您可以执行一些检查,例如
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;
}```