Symfony6.2+API Platform+MongoDB子资源报错:不支持dbRef引用
问题:API Platform + MongoDB子资源配置报错:dbRef references are not supported
环境
- Symfony 6.2
- API Platform
- MongoDB 6.0.3
代码实现
Employee类
#[ApiResource( uriTemplate: '/companies/{companyId}/employees', operations: [ new GetCollection() ], uriVariables: [ 'companyId' => new Link(toProperty: 'company', fromClass: Company::class), ] )] class Employee { #[MongoDB\Id()] private string $id; #[MongoDB\Field(type: Type::STRING)] private string $name; #[MongoDB\ReferenceOne(targetDocument: Company::class, inversedBy: "employees")] private ?Company $company; public function getId() { return $this->id; } }
Company类
#[ApiResource] class Company { #[MongoDB\Id()] public string $id; #[MongoDB\Field(type: Type::STRING)] public string $name; #[MongoDB\ReferenceMany(targetDocument: Employee::class, mappedBy: "company")] /** @var Employee[] */ #[Link(toProperty: 'company')] public $employees = []; }
报错信息
调用/companies/{companyId}/employees接口时出现:
"Cannot use reference 'company' in class 'App\\Document\\Company' for lookup or graphLookup: dbRef references are not supported."
解决方案
原因
API Platform的子资源查询逻辑不支持MongoDB默认的DBRef关联存储方式,而Doctrine MongoDB ODM的ReferenceOne/ReferenceMany注解默认会用DBRef存储关联关系,导致lookup失败。
修复步骤
修改关联字段的存储方式为纯ID
在Employee和Company类的关联注解中添加storeAs: 'id',让关联存储为目标文档的ID字符串,而非DBRef:修改后的
Employee类关联字段:#[MongoDB\ReferenceOne(targetDocument: Company::class, inversedBy: "employees", storeAs: 'id')] private ?Company $company;修改后的
Company类关联字段:#[MongoDB\ReferenceMany(targetDocument: Employee::class, mappedBy: "company", storeAs: 'id')] /** @var Employee[] */ public $employees = [];移除冗余的Link注解
删除Company类中employees字段上的#[Link(toProperty: 'company')],因为子资源的关联逻辑已经在Employee类的ApiResource注解中通过uriVariables配置完成,重复配置会引发冲突。更新数据库数据
如果已有存量数据,需要将之前以DBRef存储的company字段值替换为对应的Company ID字符串,确保新的关联逻辑能正确匹配数据。
完成以上修改后,重新调用/companies/{companyId}/employees接口即可正常获取对应公司的员工列表。
内容的提问来源于stack exchange,提问作者sayou
相关产品推荐
相关产品推荐

