Symfony 4安装Sonata User Bundle时关联字段id不存在错误求助
id referenced does not exist"错误 我之前在Symfony 4集成Sonata User Bundle时也碰到过一模一样的错误,虽然当时也坚信自己严格跟着指南走了,但最后发现是实体继承和映射的细节没处理好。给你几个排查和解决的方向:
检查自定义Group实体的主键映射
Sonata的BaseGroup是一个映射超类(mapped superclass),它不会自动生成数据库表和主键字段。如果你创建了自定义的Group实体,必须手动添加主键的ORM映射,否则Doctrine找不到关联所需的id列。正确的Group实体结构应该是这样的:namespace Application\Sonata\UserBundle\Entity; use Sonata\UserBundle\Entity\BaseGroup as BaseGroup; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="fos_group") */ class Group extends BaseGroup { /** * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * @ORM\Column(type="integer") */ protected $id; // 这里可以添加你的自定义字段和方法 }很多人会忽略这一步,直接继承
BaseGroup就完事,这是最常见的触发这个错误的原因。验证User实体中的Group关联映射
确认你的自定义User实体中,关联Group的注解里引用的主键字段是正确的。比如:/** * @ORM\ManyToMany(targetEntity="Application\Sonata\UserBundle\Entity\Group") * @ORM\JoinTable( * name="fos_user_user_group", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")} * ) */ protected $groups;这里要确保
targetEntity指向的是你自定义的Group实体,而不是Sonata的BaseGroup,同时referencedColumnName确实对应Group实体的主键字段(默认是id)。检查Sonata User Bundle的配置项
打开config/packages/sonata_user.yaml,确认实体配置指向了正确的自定义实体路径:sonata_user: class: user: Application\Sonata\UserBundle\Entity\User group: Application\Sonata\UserBundle\Entity\Group如果
group项写错成了Sonata\UserBundle\Entity\BaseGroup,Doctrine会尝试关联一个不存在表的超类,自然找不到id列。清理缓存并验证数据库 schema
有时候旧的缓存会导致映射异常,先清理缓存:php bin/console cache:clear --env=dev然后验证当前的Doctrine映射是否合法:
php bin/console doctrine:schema:validate如果验证通过,再更新数据库 schema:
php bin/console doctrine:schema:update --force(注意:生产环境执行
--force前最好先用--dump-sql预览要执行的SQL语句)
按照上面的步骤逐一排查,应该能解决这个问题。
内容的提问来源于stack exchange,提问作者Pavel Alazankin

