Vendure添加多对多关联自定义字段及查询报错排查
问题根因
relation "asset_custom_fields_products_product" does not exist报错的本质是:generate-types命令仅会生成TS/GraphQL层面的类型定义,不会自动在数据库中创建多对多关联所需的中间表,ORM查询时找不到对应表结构就会抛出该错误。
你当前在vendure-config.ts中写的自定义字段配置本身是符合多对多关联定义规范的,list: true就是Vendure标记多对多关系自定义字段的标准写法,不需要调整配置语法。
解决步骤
- 执行数据库迁移创建关联中间表
- 运行迁移生成命令,基于当前实体配置生成表结构变更SQL:
npm run migration:generate -- AddAssetProductsCustomFieldRelation - 打开生成的迁移文件做校验,确认文件中包含创建
asset_custom_fields_products_product中间表的逻辑,表内需要包含asset_id、product_id两个外键字段。 - 执行迁移应用命令,把表结构变更同步到数据库:
npm run migration:run
- 运行迁移生成命令,基于当前实体配置生成表结构变更SQL:
- (可选)配置反向关联
如果需要在Product实体侧直接查询关联的Asset资源,可以在Product的自定义字段配置中加反向关联字段:
加完反向关联之后需要重新生成、执行一次数据库迁移。customFields: { Product: [ { name: "assets", type: "relation", list: true, entity: Asset, eager: false, inverseSide: (asset: Asset) => asset.customFields.products } ], Asset: [ { name: "products", type: "relation", list: true, entity: Product, eager: false, inverseSide: (product: Product) => product.customFields.assets }, ] }
业务目标实现参考
等关联表创建完成后,不需要额外开发自定义解析器,直接在Asset列表查询中传自定义字段过滤条件,就能实现基于关联Product筛选Asset的需求,查询示例:
query GetAssetListByProductId($productId: ID!) { assets(options: { filter: { customFields: { products: { contains: $productId } } } }) { items { id name source customFields { products { id name } } } totalItems } }
你之前写的Asset列表查询语句不需要修改,迁移完成后就能正常返回关联的products数据。
内容的提问来源于stack exchange,提问作者belgiets
相关产品推荐
相关产品推荐

