使用 Doctrine ManyToMany 定义进行迁移时出现的问题

Issue when making migration with Doctrine ManyToMany definition

提问人:onizukaek 提问时间:10/6/2023 最后编辑:onizukaek 更新时间:10/8/2023 访问量:22

问:

我正在使用 symfony 6,在执行 make:migration 命令时遇到问题,我实际上想绑定 2 个名为 Team 和 User 的实体。 在团队实体下方

   #[ORM\Entity(repositoryClass: TeamRepository::class)]
   class Team
   {
       #[ORM\Id]
       #[ORM\GeneratedValue]
       #[ORM\Column]
       private ?int $id = null;

       #[ORM\Column(length: 255, nullable: true)]
       private ?string $name = null;

       #[ORM\ManyToMany(targetEntity: User::class, inversedBy: 'teams')]
       #[ORM\JoinTable(name: "team_users")]
       #[ORM\JoinColumn(name: "user_id", referencedColumnName: "uuid")]
       #[ORM\InverseJoinColumn(name: "team_id", referencedColumnName: "id")]
       private Collection $members;

       ...

在 User 实体下方:

   #[ORM\Entity(repositoryClass: UserRepository::class)]
   class User
   {
   #[ORM\Id]
   #[ORM\GeneratedValue(strategy: 'CUSTOM')]
   #[ORM\Column(type: 'uuid', unique: true)]
   #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
   #[Groups([GRP_USER_READ, SerializationGroups::REST])]
   private $uuid;

   #[Groups([GRP_USER_READ, SerializationGroups::REST])]
   #[ORM\Column(type: 'string', length: 180, unique: true)]
   #[Assert\NotBlank]
   #[Assert\Email]
   private $email;

   #[ORM\Column(type: 'json')]
   #[Groups([GRP_USER_READ, SerializationGroups::REST])]
   private $roles = [];

   #[ORM\Column(type: 'string')]
   private $password;
   
   #[ORM\ManyToMany(targetEntity: Team::class, mappedBy: 'members')]
   private Collection $teams;

   ...

然后,当我清除缓存并启动 make:migration 时,我直接得到一个异常:

针对 App\Entity\Team 中的关系引用的列名称“uuid” 朝向 App\Entity\User 不存在。

检查数据库和 User 实体中的所有内容后,名为 uuid 的字段是正确的。

我对 php8 属性的工作原理有点困惑,我从这里的 doctrine 文档中举了这个例子,是否缺少一些东西来正确定义这种关系?

学说 php-8 symfony6

评论


答:

0赞 onizukaek 10/8/2023 #1

解决了,实际上这是属性配置中的误解,我在 User 实体中移动了拥有方,并在 Team 实体中留下了一个引用,所以这是您在 User 中得到的内容:

   #[ORM\ManyToMany(targetEntity: Team::class, inversedBy: 'members')]
   #[ORM\JoinTable(name: "user_teams")]
   #[ORM\JoinColumn(name: "user_id", referencedColumnName: "uuid")]
   #[ORM\InverseJoinColumn(name: "team_id", referencedColumnName: "id")]
   private Collection $teams;

在团队中:

   #[ORM\ManyToMany(targetEntity: "User", mappedBy: 'teams')]
   private Collection $members;