Но в postgresql есть есть тип serial
неа, нет его.
Это именно синтаксический сахар вокруг create sequence + integer с DEFAULT nextval('users_id_seq'::regclass)
Посмотрите в pg_dump, не найдёте ни одного serial
вручную изменить тип поля на serial?
alter table foo alter COLUMN i type serial;
ERROR: type "serial" does not exist
А вот не сможете, нет такого типа данных.
2. unsigned
Оказывается его нет в postgresql. Заменить на CHECK (имя_поля >= 0)? Или ещё какие варианты (если есть, то чем они лучше)?
Да, unsigned типов нет. Можно check к полю добавлять, можно сделать create domain сразу с check и использовать имя этого домена в качестве типа данных.
И опять-таки в миграциях лары нет никакого check()
Я думаю в этих миграциях нет почти всего, даже из SQL92 стандарта. Утилиты миграций за исключением тех, что дают выполнять произвольный SQL, обычно ничего не умеют из возможностей базы, стоит лишь чуть копнуть вглубь.
3. массивы
Для mysql использовала string и туда записывала данные в виде json. Для postgresql пока выбрала прямо json. В миграциях он доступен. Или стоит выбрать тип массива? В чём разница между массивами и json в postgresql?
Есть json. В json бывают массивы, бывают объекты, скаляры.
Есть отдельно массивы в postgresql как отдельные типы данных. Вы можете сделать массив из json документов.
Разница между json и массивами - разные наборы функций, операторов.
Что-то laravel, как я пока вижу, мало адаптирован к работе с postgresql.
Раз для mysql вместо json используется string (text видимо всё-таки) - то и для mysql не очень адаптирован. Ну или у вас mysql какой-то очень сильно древний.
Такие конструкторы обычно адаптированы под людей, которые не знают и знать не хотят свою базу.