Size: a a a

2020 December 05

ДК

Дмитрий Кожанов... in Laravel Pro
С папуасами на острове тусить
источник
2020 December 06

M7

MaZaHaKa 7 in Laravel Pro
Ребят, как думаете, есть поле в табличке, в ней хранится битмаск, в котором может быть только 1 статус в одно время , ну там ещё может быть режим. Первый бит это режим, если выставлен в единичку, то значит «авто» если нет, то «руками». И 5 статусов разных но взаимоисключающих. По этой колбасе нужно искать, чтобы статус был одним из определённых, например 1,2,3.

Select * from payment_requests where ((bitmask & 2) != 0) or ((bitmask & 4) != 0) or ((bitmask & 8) != 0) and user_id in (153)

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

M7

MaZaHaKa 7 in Laravel Pro
Ещё в ларе из коробки такого нет, и приходится руками собирать запрос и делать where raw в зависимости от статусов
источник

DZ

Daniil Zobov in Laravel Pro
Ужоснах, а почему нельзя сделать просто enum из статусов, сделав дубли статусов для тех, что выставлены ручками ?)
источник

ДК

Дмитрий Кожанов... in Laravel Pro
Daniil Zobov
Ужоснах, а почему нельзя сделать просто enum из статусов, сделав дубли статусов для тех, что выставлены ручками ?)
Enum в бд тоже не лучший выбор
источник

M7

MaZaHaKa 7 in Laravel Pro
Изначально было 2 поля, 2 инта, один для статусов а второй для режима
источник

M7

MaZaHaKa 7 in Laravel Pro
Дмитрий Кожанов
Enum в бд тоже не лучший выбор
Да, с этим есть проблемы
источник

M7

MaZaHaKa 7 in Laravel Pro
MaZaHaKa 7
Изначально было 2 поля, 2 инта, один для статусов а второй для режима
Но «зачем два поля, если можно битмаск?»
источник

DZ

Daniil Zobov in Laravel Pro
Ручные выборки и в целом дебаг этого хозяйства может превратиться в сущий ад.

Вообще битовая маска не совсем для этого придумана.

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

DZ

Daniil Zobov in Laravel Pro
Дмитрий Кожанов
Enum в бд тоже не лучший выбор
ну лучше справочник статусов в отдельной табличке
источник

DZ

Daniil Zobov in Laravel Pro
Но тут вопрос больше в том, сколько их
источник

M7

MaZaHaKa 7 in Laravel Pro
5 штук сейчас
источник

DZ

Daniil Zobov in Laravel Pro
Если их три штуки, то делать таблицу под них глуповато
источник

DZ

Daniil Zobov in Laravel Pro
если есть тенденция к расширению, надо выносить, иначе и enum сойдет. Но можно enum и на коде реализовать, чтобы лишний раз БД не трогать при изменении набора статусов
источник

M7

MaZaHaKa 7 in Laravel Pro
Daniil Zobov
если есть тенденция к расширению, надо выносить, иначе и enum сойдет. Но можно enum и на коде реализовать, чтобы лишний раз БД не трогать при изменении набора статусов
Да, так планировал изначально
источник

M7

MaZaHaKa 7 in Laravel Pro
Спасибо за ваши ответы :)
источник

ДТ

Дмитрий Тремасов... in Laravel Pro
MaZaHaKa 7
Ещё в ларе из коробки такого нет, и приходится руками собирать запрос и делать where raw в зависимости от статусов
Сделай у модели scopeWhereMaskIs(Builder $builder, $mask) и используй без whereRaw. Если таки моделей много - то вынеси scope в трейт
источник

M7

MaZaHaKa 7 in Laravel Pro
Дмитрий Тремасов
Сделай у модели scopeWhereMaskIs(Builder $builder, $mask) и используй без whereRaw. Если таки моделей много - то вынеси scope в трейт
Спасибо , тут скорее был вопрос про битмаск именно. https://stackoverflow.com/questions/16363761/bitmasks-vs-separate-columns

По итогу это полная фигня для решения этой задачи...
источник

ДТ

Дмитрий Тремасов... in Laravel Pro
Имхо битовые операции конечно быстрые - но так или иначе уступают простому сравнению.
источник

M7

MaZaHaKa 7 in Laravel Pro
Ну тут речь о том что поиск по ним долгий , тк нет индексации
источник