Symfony继承ORM实体用UniqueEntity校验时出现SQL别名错误如何解决
问题根源
你当前的Doctrine ORM继承配置存在两处核心错误,直接导致查询别名不匹配:
- 继承映射类型配置错误:三个实体类都标注了
@Entity、映射到同一张user表,且子类重复定义了父类已经存在的id主键字段,Doctrine处理单表继承时逻辑混乱,生成查询时错误生成了多表别名。 @UniqueEntity注解放在父类BaseUser上,校验子类实体时,Doctrine会默认基于父类元数据生成查询,和子类查询生成的别名t1不匹配,才会出现WHERE子句引用不存在的t0别名的问题。
修复步骤
- 第一步:选择适配业务的继承模式,如果你的业务逻辑是
User和Children都存储在同一张user表中,需使用Doctrine单表继承配置,父类保留实体注解、定义鉴别器映射,子类删除重复的@Table、id字段定义:
// 调整后的BaseUser.php /** * @ORM\Entity(repositoryClass=BaseUserRepository::class) * @ORM\Table(name="user") * @ORM\InheritanceType("SINGLE_TABLE") * @ORM\DiscriminatorColumn(name="user_type", type="string") * @ORM\DiscriminatorMap({"user" = "User", "children" = "Children"}) * @UniqueEntity("email") * @ORM\HasLifecycleCallbacks() */ class BaseUser implements UserInterface, PasswordAuthenticatedUserInterface { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private ?int $id; /** * @ORM\Column(type="string", length=180, unique=true) * @Assert\NotBlank */ private ?string $email; // 其余父类字段保持不变 }
// 调整后的User.php /** * @ORM\Entity */ class User extends BaseUser implements UserInterface, PasswordAuthenticatedUserInterface { // 仅保留子类独有的字段,删除重复的id、所有继承自父类的字段定义 }
// 调整后的Children.php /** * @ORM\Entity */ class Children extends BaseUser { // 仅保留子类独有的字段,删除重复的id、所有继承自父类的字段定义 }
- 第二步:如果你的业务不需要统一查询两类用户,仅需要保证邮箱全局唯一,也可以将
BaseUser改为映射超类,删除父类的@Entity、@Table注解,替换为@ORM\MappedSuperclass,再把@UniqueEntity("email")注解放到两个子类上,同样可以解决别名冲突问题。
内容的提问来源于stack exchange,提问作者domskat
相关产品推荐
相关产品推荐

