Статусы - какой тип данных использовать?

В настоящее время я просматриваю созданный мной код и пытаюсь улучшить его читаемость и качество. Вот пример того, как я подхожу к простой проблеме, которую я всегда считал плохим решением.

Таблица пользователей со следующими «статусами» или уровнями высоты в этом примере

  1. Работник
  2. Руководитель
  3. Админ

(это может быть что угодно, например, проект может иметь статус «незавершенный», «приостановленный» или «завершенный»)

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

if userLevel === 3 { return "Admin"; };

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

Если бы я добавил строку:

if userLevel !== 2 OR 3 { // Redirect to error page };

Вы можете видеть, как это может сбивать с толку в будущем.

Недавно я начал хранить эти «статусы» в виде строки, чтобы ее было удобнее читать. Но теперь я все больше вхожу в Laravel, и мне интересно, следует ли мне иметь дополнительные таблицы базы данных, посвященные исключительно этому.

Итак, мой вопрос - какой тип данных подходит для такого рода данных и как лучше всего с ними взаимодействовать?

Это строка? Тип возврата - строка. Это int? возвращаемый тип - int. и т. д. и т. д. и т. д. ..... Содержание строки, значение int, количество массива и т. д. и т. д. не имеет отношения к определению типа, это то, что есть.

ggdx 06.07.2018 12:32

Почему вы конвертируете int в текст в коде, когда он уже находится в базе данных?

Raymond Nijland 06.07.2018 12:35

@RaymondNijland Нет никакой логической причины, меня так учили, и я начинаю сомневаться. Как я упоминал в посте, никогда не казалось правильным, что я должен преобразовывать шрифт.

Matadeleo 06.07.2018 12:38

Есть еще два стола. Один будет содержать роли, второй - для привязки пользователя к роли, а именно UserRole. Я думаю, гораздо более динамичный и более детальный контроль.

frz3993 06.07.2018 12:45

Константы - хороший способ справиться с этим; плюс они в основном являются тем способом, которым сам PHP обрабатывает подобные вещи уже во многих местах (например, сообщение об ошибке E_ALL). «При распечатке счетов и их статусов я напишу функцию, чтобы преобразовать это обратно в текст» - ничего плохого в этом ИМХО, плюс вы все равно не захотите, чтобы это было жестко закодировано с фактическим текстом, если, например, добавление второго языка на веб-сайт может быть вариантом в будущем. Избегайте такой прямой корреляции между логикой вашего приложения и вашим пользовательским интерфейсом.

CBroe 06.07.2018 12:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
59
2

Ответы 2

В устаревшем коде я бы использовал константы, и в основном бит не имеет значения, какие данные в нем. Он удобочитаемый, вы можете легко найти способы использования, и ваша IDE может вам помочь.

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

В БД - вы можете найти пару статей, в которых говорится, что перечисление - не очень хорошая идея. Если вы хотите много оптимизировать, вам может помочь tinyint, но также хорошо использовать короткую строку (я обычно ее использую). Затем вам следует перевести его на php ofc, я рекомендую объектный подход, описанный выше.

это может или не может соответствовать вашему конкретному приложению, но я часто обнаруживал, что побитовые операции удобны для того, чтобы атрибуты 0 or more были представлены одним целым числом.

например скажем, вы назначаете следующее:

$admin = 0b1; //(1)
$employee = 0b10; //(2)
$supervisor = 0b100; //(4)

теперь вы хотите назначить целочисленное значение для $status, которое является побитовым or соответствующих значений.

Итак, супервизор - это как employee, так и supervisor, поэтому они будут иметь целочисленное значение

2|4 = 0b010 | 0b100 = 0b110 = 6.

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

if (($statusInt & $supervisor) != 0){
    // it is a supervisor...  //maybe more, at least supervisor
}

конечно, таким образом вы можете иметь намного больше statuses в одном целочисленном столбце или столбце базы данных INT.

Другие вопросы по теме