如何在YAML文件中引用数据库中已存在的实体?
解决Fixture配置中引用数据库已存在实体的问题
问题场景
你在配置Fixture的YAML文件时,尝试为App\Entity\Dummy的status字段关联数据库中已存在的App\Entity\Status实体(ID 1-3),原配置如下:
App\Entity\Dummy: dummy_{1..10}: name: '<firstName()>' surnames: '<lastName()>' email (unique): '<email()>' startDate: '<dateTimeBetween("-200 days", "now")>' subject: '<sentence()>' status: '<numberBetween(1, 3)>'
使用--append选项加载时出现类型错误:
为对象“dummy_1”(类:App\Entity\Dummy)的属性“status”提供的值无效
属性路径“status”处期望参数类型为“?App\Entity\Status”,但传入了“int”
解决方案
使用Alice的表达式语言(以
@=开头)结合entity()函数,直接从数据库获取指定实体:
将原配置中的status: '<numberBetween(1, 3)>'替换为:status: '@=entity("App\Entity\Status", <numberBetween(1,3)>)'解释:
entity()函数会通过Doctrine EntityManager查询指定类和ID的实体,返回的是App\Entity\Status对象,完全匹配字段类型要求。若要随机选取所有已存在的Status实体(不依赖固定ID范围),可以改用以下配置:
status: '@=randomElement(entityManager()->getRepository("App\Entity\Status")->findAll())'
修改后的完整YAML示例
App\Entity\Dummy: dummy_{1..10}: name: '<firstName()>' surnames: '<lastName()>' email (unique): '<email()>' startDate: '<dateTimeBetween("-200 days", "now")>' subject: '<sentence()>' status: '@=entity("App\Entity\Status", <numberBetween(1,3)>)'
内容的提问来源于stack exchange,提问作者K. Weber
相关产品推荐
相关产品推荐

