ORM 原则 - JoinTable 和 JoinColumn "column not found" 或 "could not resolve type of the column"

ORM Doctrine - JoinTable and JoinColumn "column not found" or "could not resolve type of the column"

我是 Doctrine 的初学者,我陷入了一种尝试在 2 个实体之间建立连接 table 的循环。

很明显,我在“火车”和“容器”之间存在一对多关系,在“容器”和“火车”之间存在多对一关系。

我像这样在 OneToMany 关系上放置了注释:

@ORM\Entity/Train

@ORM\OneToMany(targetEntity=Container::class, mappedBy="Train")
@ORM\JoinTable(name="train_container", 
@ORM\joinColumns={@JoinColumn(name="id_tm", referencedColumnName="id_tm", nullable=false)},
@ORM\inverseJoinColumns={@JoinColumn(name="id_container", referencedColumnName="id_container", nullable=false)})
      )
    
private $Container;

在 ManyToOne 上我是这样做的:

@ORM\Entity/Container 

@ORM\ManyToOne(targetEntity=Train::class, inversedBy="Containers")
@ORM\JoinColumn(name="id_tm", referencedColumnName="id_tm")
private $Train;

现在,如果我让它这样,我会收到一条错误消息:

Annotation @ORM\joinColumns is not allowed to be declared on property App\Entity\Train::$container. You may only use this annotation on these code elements: PROPERTY.

如果我删除 joinColumn 并只放这个:

@ORM\ManyToOne(targetEntity=Train::class, inversedBy="Container")
private $Train;

我有这个错误:

Could not resolve type of column "id" of class "App\Entity\Train"

我不知道为什么它显示“id”列,因为列的名称和“Train”上的 属性 总是到处都是“id_tm”。

有人能告诉我我做错了什么吗?

非常感谢 M

编辑以在 id 的属性上添加代码:

@ORM\Id
@ORM\GeneratedValue
@ORM\Column(type="integer", name="id_container")

private $id_container;
@ORM\Id
@ORM\GeneratedValue
@ORM\Column(type="integer", name="id_train")

private $id_train;

Train实体上,您需要使用ManyToMany注释和unique参数来获得OneToMany关联,如[=21=中所示].

这是对我有用的代码,试试这个:

训练实体

/**
 * Class Train
 * @package App\Entity
 * @ORM\Entity()
 * @ORM\Table(name="train", options={"comment":"Train"})
 */
class Train
{

    /**
     * @var int
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(name="id_train", type="integer", unique=true)
     */
    private int $id_train;


    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Container", mappedBy="Train", cascade={"persist"})
     * @ORM\JoinTable(name="train_container",
     *     joinColumns={@ORM\JoinColumn(name="train_id", referencedColumnName="id_train")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="container_id", referencedColumnName="id_container", unique=true)}
     * )
     */
    private $Container;


    public function __construct() {
        $this->Container = new ArrayCollection();
    }
    
    //....

此外,如果您想在 ContainerTrain 实体之间建立双向关系,则需要在 Container 实体中指定以下内容。

容器实体

/**
 * Class Container
 * @package App\Entity
 * @ORM\Entity()
 * @ORM\Table(name="container", options={"comment":"Container"})
 */
class Container
{

    /**
     * @var int
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(name="id_container", type="integer", unique=true)
     */
    private int $id;


    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Train", inversedBy="Container")
     * @ORM\JoinColumn(name="train_id", referencedColumnName="id_train")
     */
    private $Train;

不要忘记在

之后生成 getter 和 setter
 php bin/console make:entity --regenerate

并更新架构

php bin/console d:s:u -f