一个了困扰了我两天的问题原来仅仅是注释风格

在研究一个API Platform的关系映射的时候,发现多对一不可用,一对多可用。在研究2天,询问了chatGPT后,突然发现一个只使用新PHP8注释风格,不工作。一个是混合2种的。

混合的多对一风格的,能运行

    /**
     * @var \Product
     *
     * @ORM\ManyToOne(targetEntity="Product")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     * })
     */
    #[Groups(['productImage:read'])]
    #[ORM\ManyToOne(targetEntity: Product::class, inversedBy: 'productImages')]
    #[ORM\JoinColumn(name: 'product_id', referencedColumnName: 'id')]
    public ?Product $product;


只有PHP8注释的,不行

    #[Groups(['product:read'])]
    #[ORM\OneToMany(mappedBy: 'product', targetEntity: ProductImage::class, cascade: ['persist'])]

后来改为混写的就可以了。

   /**
     * @var Collection
     *
     * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="product")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id", referencedColumnName="product_id")
     * })
     */
    #[Groups(['product:read'])]
    #[ORM\OneToMany(mappedBy: 'product', targetEntity: ProductImage::class, cascade: ['persist'])]

记录一个已经快要失传的doctrine的脚本,从数据表生成实体

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

另外在使用的时候,doctrine老说 Malformed database connection URL 错误。 是数据库配置问题。后来查了一下这里,说是DATABASE_URL中的特殊符号,比如我的密码中的#导致解析失败。更改密码,去除特殊符号就ok了。