Пользовательский идентификатор Laravel 5.6 со счетчиком сброса мутатора каждый день - PullRequest
0 голосов
/ 23 января 2019

Я использую мутатор для создания собственного идентификатора для своих записей, чтобы он выглядел так:

гггг-мм-дд- {последовательность}

последовательность выглядит следующим образом

00001
00002
...

Так что это 5 цифр и просто счетчик.

У меня 2 проблемы

1) Я не знаю, как создать счетчик в моем мутаторе, яЯ могу сделать цикл for, но я не знаю, как сделать цикл infinte, который сбрасывается, когда наступит завтра.

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;
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Трудно сказать это, но, в самом хорошем смысле, ваш счетчик не имеет никакого смысла, извините! Я бы порекомендовал полностью избавиться от этого или хотя бы прочитать документацию по PHP на str_pad.

У вас также есть условное утверждение, которое проверяет "сегодня завтра". Для меня это большой красный флаг, что логика, в общем-то, неверна.

Давайте подумаем над альтернативой. По сути, вы подсчитываете количество записей в день, чтобы использовать его в качестве идентификатора. Я бы предложил подход, подобный этому:

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 - из документов (поиск whereDate)

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

Итак, если бы мы сделали 3 записи сегодня, $count было бы 3.

2. Сделайте ID, который является этим числом + 1

$count ++;

3. Если нужно, строковую площадку оставьте с нулями

Документы PHP на str_pad довольно ужасны, давайте просто рассмотрим основы:

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)

Я не могу вспомнить, как установить атрибут с помощью мутатора, поэтому просто скопировав ваш пример (надеюсь, это правильно!), Мы получим:

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;
}

Не забудьте делать это только при создании, так как мы не хотим увеличивать этот идентификатор при каждом сохранении.

0 голосов
/ 23 января 2019

Я не знаю, для чего предназначен ваш код, но это всегда будет устанавливать для «functions_id» что-то вроде «2019-01-23-100000000001», так как вы используете переменную $counter вне цикла.

Ваш цикл зацикливается, ничего не делая. (И какого черта вы зацикливаетесь до такого большого числа, если вы не ожидаете более 100000 записей?!?)

Вам нужен предыдущий счетчик, который вы установили, эфир из БД или где-то еще, но так ваш код не будет работать. Таким образом, вы можете выполнить некоторую проверку, как if ($dateOfLastEntry != Carbon::now()->format('Y-m-d')) {$counter = 1} в противном случае установите $counterOfLastEntry + 1 не используя тот страшный цикл, который вы используете str_pad выполняется в конце

Может быть, вы дадите нам немного больше информации, как это должно работать, для чего вы собираетесь использовать этот счетчик, и где вы собираетесь хранить эти данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...