Laravel: Как получить значение счетчика при вставке с UUID и автоинкрементом - PullRequest
1 голос
/ 26 февраля 2020

Мои модели имеют атрибуты id и counter. Идентификатор представляет собой UUID, а счетчик представляет собой целое число, которое автоматически увеличивается базой данных.

Оба являются уникальными, однако я полагаюсь на id в качестве первичного ключа. counter - это просто понятное человеку имя, которое я иногда показываю пользователю.

Непосредственно перед созданием объекта слушатель присваивает ему UUID. Это прекрасно работает.

Когда запись сохранена, MySQL увеличивает поле счетчика. Это прекрасно работает, за исключением того, что копия объекта, который у меня есть в памяти, не имеет значения счетчика. Я могу перезагрузить объект, чтобы узнать, каков его счетчик, но для этого потребуется другой запрос к базе данных.

Есть ли способ найти значение счетчика без определенного c запроса к базе данных? Например, возвращается ли он как часть ответа из базы данных при создании записи?

1 Ответ

0 голосов
/ 26 февраля 2020

Мало вещей:

  1. Используйте create(array $attributes), и вы получите именно то, что хотите. Для этого вам нужно убедиться, что массив $fillable содержит имена всех атрибутов, переданных методу create.

  2. Вы должны использовать Observer на модели вместо слушателя (наиболее вероятный метод создания).

  3. Персональные предпочтения при использовании Eloquent в том, что вы должны использовать id для идентификатора (поле приращения) и забыть о пользовательских настройках между моделями, потому что по умолчанию это то, что ожидают отношения, и так далее

    public function secondModels()
    {
        return $this->hasMany(SecondModel::class);
    }
    

в значительной степени не сложно. Но для этой работы лучше всего было бы (также следуя рекомендациям этого парня ) FirstModel::id, SecondModel::id, SecondModel::first_model_id; first_models, second_models в качестве имен таблиц. Избегать и / или пропускать такого рода объединение - большая часть заказной работы впоследствии. Я не говорю, что это не может быть сделано, но это не первая успешная работа.

Кроме того, если вы хотите, чтобы посетитель получил что-то, отличное от id имени поля, вы можете создать вычисляемое поле с аксессором:

/**
 * Get the user's counter.
 *
 * @return string
 */
public function getCounterAttribute(): string
{
    return (string)$this->id;
}

Который вы вызываете тогда с $user->counter.

Кроме того, мое личное предпочтение состоит в том, чтобы иметь как можно больше описательных имен переменных, так что мое поле uuid могло бы выглядеть примерно так:

$table->uuid('uuid4');

Это хорошо и легко сделайте практику использования Eloquent.

Сказав все это, позвольте мне сказать, что create() и save() будут возвращать созданный объект из базы данных, в то время как insert() не будет этого делать.

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