Laravel дает тип данных бит / байт при миграции

Есть ли какая-либо база данных, похожая на бит (байт) в laravel, не удалось найти ни одной в документации. (https://laravel.com/docs/5.1/migrations).

Я пытаюсь сделать что-то вроде:

00000001 -> stands for something lets say playstation

00000010 -> stands for xbox

00000011 -> stands for both above

4

Решение

Вместо того, чтобы пытаться использовать тип данных 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 будет ложным.

2

Другие решения

Других решений пока нет …