Есть ли какая-либо база данных, похожая на бит (байт) в laravel, не удалось найти ни одной в документации. (https://laravel.com/docs/5.1/migrations).
Я пытаюсь сделать что-то вроде:
00000001 -> stands for something lets say playstation
00000010 -> stands for xbox
00000011 -> stands for both above
Вместо того, чтобы пытаться использовать тип данных BIT, с которым было бы немного хлопотно работать, вы можете просто использовать вместо этого целочисленные и побитовые операторы, предполагая, что вам не нужно больше 32 опций для одного поля (bigint = 8 байт = 32 бита).
В качестве очень простого примера представьте, что вы создали следующий класс enum:
class Bitmask {
const ATARI = 1 << 0; // 00000001 (1)
const NES = 1 << 1; // 00000010 (2)
const SNES = 1 << 2; // 00000100 (4)
const SEGA = 1 << 3; // 00001000 (8)
const PLAYSTATION = 1 << 4; // 00010000 (16)
const XBOX = 1 << 5; // 00100000 (32)
}
Чтобы установить поле, все, что вам нужно сделать, это добавить битовые маски вместе (в этой конфигурации ORing (|) они одинаковы). Если у пользователя есть NES и PLAYSTATION:
$user->systems = Bitmask::NES + Bitmask::PLAYSTATION;
Для запроса вы должны использовать побитовые операторы. Итак, если вы хотите, чтобы пользователи, имеющие SEGA:
User::where('systems', '&', Bitmask::SEGA)->get();
Если вы хотите, чтобы пользователи имели PLAYSTATION или XBOX:
User::where('systems', '&', Bitmask::PLAYSTATION | Bitmask::XBOX)->get();
&
Оператор выполнит побитовую операцию И между целочисленным полем и целым числом, которое вы передаете. Если какой-либо из битов совпадает, &
Оператор вернет значение> 0, и предложение where будет верным. Если ни один из битов не совпадает, &
оператор вернет 0, а предложение where будет ложным.
Других решений пока нет …