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();
}
//....
此外,如果您想在 Container
和 Train
实体之间建立双向关系,则需要在 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
我是 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();
}
//....
此外,如果您想在 Container
和 Train
实体之间建立双向关系,则需要在 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