从旧站 Asteria(Magento 1.x)只读导入用户、评论、订单到本店。源库以 as 为准(不要用 longyishop)。三条命令共用 Laravel 连接名 asteria,可分批、可断点续跑、可 --dry-run,重复执行不会重复插入。
推荐顺序: 先同步商品,再迁用户,再迁订单 / 评论。
php artisan migrate
php artisan catalog:sync # 商品 SKU 需与 Magento 一致
php artisan customers:migrate-asteria
php artisan orders:migrate-asteria
php artisan reviews:migrate-asteria --sync # 或走队列,见下文
.env 中配置只读 Magento 库(应用层只跑 SELECT):
ASTERIA_DB_HOST=127.0.0.1
ASTERIA_DB_PORT=3306
ASTERIA_DB_DATABASE=as
ASTERIA_DB_USERNAME=root
ASTERIA_DB_PASSWORD=
ASTERIA_DB_PREFIX= # Magento 有表前缀时填写,例如 mag_
ASTERIA_DB_CHARSET=utf8
连接名默认 asteria,定义在 config/database.php。所有命令都支持 --connection= 覆盖。
跑迁移前确认 Bagisto 侧列已存在:
php artisan migrate
| 表 | 幂等列 | 迁移文件 |
|---|---|---|
customers |
migrated_from_asteria_id(unique),另有 legacy_password |
database/migrations/2026_08_20_163200_add_asteria_migration_columns_to_customers_table.php |
orders |
migrated_from_asteria_id(unique) |
database/migrations/2026_08_25_143200_add_asteria_migration_column_to_orders_table.php |
product_reviews |
migrated_from_asteria_id(unique) |
评论命令在缺列时会提示,也可交互自动 ALTER TABLE |
customers:migrate-asteria同步写入 Bagisto customers + addresses(同步、无队列)。
php artisan customers:migrate-asteria
php artisan customers:migrate-asteria --batch-size=200
php artisan customers:migrate-asteria --dry-run
php artisan customers:migrate-asteria --reset-progress
源表:customer_entity、customer_address_entity 及对应 EAV。
行为要点:
migrated_from_asteria_id 或相同邮箱(不区分大小写):关联,不覆盖姓名/密码,只补未导入的地址。general 分组、默认 Channel;password 为随机 bcrypt,Magento 哈希放在 legacy_password。用户用旧密码登录成功后会自动升级为 bcrypt。phone 置空。addresses.additional.asteria_address_id 去重;街道换行压成 ,。进度缓存:migrate_asteria_customers_last_id(30 天)。
reviews:migrate-asteria写入 product_reviews。默认按队列 review-migration 分批投递;--sync 则当场处理。
php artisan queue:work --queue=review-migration # 非 --sync 时需要
php artisan reviews:migrate-asteria
php artisan reviews:migrate-asteria --batch-size=200
php artisan reviews:migrate-asteria --status=1 # 仅 Magento 已审核
php artisan reviews:migrate-asteria --sync
php artisan reviews:migrate-asteria --dry-run
php artisan reviews:migrate-asteria --reset-progress
--status:Magento status_id,1=approved,2=pending,3=not-approved。不传则全部导入,状态映射为 Bagisto 的 approved / pending / disapproved。
关联方式:
catalog_product_entity.sku ↔ Bagisto products.sku。对不上的评论会跳过并打日志。customer_id;没有则游客名(name)。review_media_image 的 URL,后续再批量上 S3(不在本命令内下载文件)。进度缓存:migrate_asteria_reviews_last_id(30 天)。
orders:migrate-asteria同步写入订单头、商品行、账单/收货地址、支付方式。
php artisan orders:migrate-asteria
php artisan orders:migrate-asteria --batch-size=100
php artisan orders:migrate-asteria --dry-run
php artisan orders:migrate-asteria --reset-progress
源表:sales_flat_order、sales_flat_order_item、sales_flat_order_address、sales_flat_order_payment。
会做:
increment_id 和 created_at,方便用户认历史单号。customers.migrated_from_asteria_id,再按邮箱;都没有则游客单(快照姓名/邮箱仍写入)。product_id 为空。complete → completed;canceled → canceled;pending_payment / payment_review / pending_paypal → pending_payment;holded → pending;其余常见状态原样对应,未知为 pending。paypal_express / paypal_standard / paypaluk_* → paypal_standard;checkmo → moneytransfer;klarna* → klarna;afterpay* / clearpay* → afterpay。原文写在 order_payment.additional.magento_method。不做: 发票、发货、退款;不扣库存;不触发下单邮件 / 礼品卡等 checkout.order.save.after 事件。
跳过规则:
migrated_from_asteria_id(幂等)。increment_id 已被 Bagisto 现网订单占用(避免覆盖新单)。increment_id 为空。进度缓存:migrate_asteria_orders_last_id(30 天)。
| 选项 | 含义 |
|---|---|
--batch-size |
每批条数,默认 100 |
--dry-run |
只统计,不写库,也不更新进度 |
--reset-progress |
从 ID=0 重新扫(仍幂等,已迁记录会 skip) |
--connection |
源库连接名,默认 asteria |
中断后再次执行会从缓存的 last id 继续。换环境或确认要重扫时加 --reset-progress。
后台管理员、收藏、积分、购物车 Quote、发票、发货单、退款单都不在这三条命令范围内。
连不上 Asteria: 检查 .env 的 ASTERIA_DB_*,以及 Magento 表前缀 ASTERIA_DB_PREFIX。源库必须是 as,不要配成 longyishop。
MySQL 5.6 Unknown column 'generation_expression': Laravel 自带的 Schema::hasColumn() 会查 5.7 才有的 information_schema.columns.generation_expression。迁移脚本已改用 SHOW COLUMNS,可在 5.6 上跑。若 TablePlus 等客户端仍报这个错,是客户端自己在看表结构,与迁移无关。
提示缺列: 先 php artisan migrate。评论列也可在命令交互里自动加。
评论一条都没有 / 大量 skip: 先确认 catalog:sync 后 SKU 与 Magento 一致。
订单是游客单: 先跑用户迁移,并确认 Magento customer_id / 邮箱能对上 migrated_from_asteria_id 或 Bagisto 邮箱。
旧密码登不上: 新迁用户密码在 legacy_password。Web 登录与 API 登录都会走 Magento 1 MD5(可带 salt)校验,成功后改成 bcrypt。已存在的 Bagisto 账号被「关联」时不会写入 legacy_password,仍用原 Bagisto 密码。
重复跑会不会翻倍: 不会。用户按 Asteria ID / 邮箱,地址按 asteria_address_id,订单/评论按 migrated_from_asteria_id。