Ответ 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
]