Тип массива миграции Laravel

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

Миграция:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->integer('shifts');  <<--------- HERE I want to store an array of integers
        $table->integer('status_id');

        $table->timestamps();
    });
}

Ответы

Ответ 1

Тип данных array отсутствует во всех системах баз данных, и поскольку Laravel Schema Builder является агностиком базы данных, он не предлагает методы для создания не общих столбцов типа данных. Таким образом, у вас есть два варианта:

1. Используйте дополнительный SQL-оператор для добавления столбца, что-то вроде инструкции ниже, я думаю, должен работать. Хотя я не уверен, что Query Builder или Eloquent могут корректно обрабатывать эти типы столбцов:

DB::statement('ALTER TABLE pickups ADD COLUMN shifts integer[]');

2. Используйте доступный способ обхода Eloquent, используя атрибут casting. В вашей миграции создайте столбец как json так:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->json('shifts');
        $table->integer('status_id');

        $table->timestamps();
    });
}

Затем вы можете настроить свою модель Pickup (если вы этого еще не сделали) и использовать свойство $casts:

class Pickup extends Model
{
    protected $casts = [
        'shifts' => 'array'
    ];
}

Это позволит Eloquent знать, что когда он извлекает данные из базы данных, он должен будет преобразовать значение столбца shifts в array. Это только эмуляция реального массива, так как на уровне базы данных столбец имеет тип TEXT и массив сериализуется. Однако при неэтериализации значения столбца Eloquent возвращает фактический массив целых чисел для использования в вашем коде. Ниже приведен пример использования:

// Create a new Pickup entry
$pickup = App\Pickup::create([
    'default' => true,
    'shifts' => '[1, 5, 7]', // you can easily assign an actual integer array here
    'status_id' => 1
]);

Предполагая, что вышеприведенная запись с id равна 1 когда вы позже извлекаете запись:

$pickup = App\Pickup::find(1);
dump($pickup->shifts);

dump() из приведенного выше кода выведет фактический массив целых чисел:

array:3 [▼
  0 => 1
  1 => 5
  2 => 7
]