最初,实体Gut
有一个包含字符串的字段reaction
。reaction
的选项被硬连接在一个模板中。通过添加实体Reaction
并将Gut
表单的reaction
更改为EntityType
,我现在受到错误消息
SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.reaction' in 'field list'
尽管我已经重写了Gut
&Reaction
实体。我可能因为树木而忽略了整个森林。下面有什么问题吗?
MySQL表gut
:reaction
列替换为reaction_id
;reaction_id
已正确创建;手动创建外键。
这个控制器方法出现错误:
#[Route('/', name: 'app_gut_index', methods: ['GET'])]
public function index(GutRepository $gutRepository): Response
{
$guts = $gutRepository->findBy([], ['happened' => 'DESC']); // error thrown here
return $this->render('gut/index.html.twig', [
'guts' => $guts,
]);
}
Gut
entity:
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 255)]
#[ORMManyToOne(targetEntity: Reaction::class)]
#[ORMJoinColumn(name: 'reaction_id', referencedColumnName: 'id')]
protected $reaction;
#[ORMColumn(length: 255, nullable: true)]
private ?string $description = null;
#[ORMColumn(name: "datetime")]
private ?DateTime $happened = null;
public function getId(): ?int
{
return $this->id;
}
public function getReaction(): ?Reaction
{
return $this->reaction;
}
public function setReaction(?Reaction $reaction): self
{
$this->reaction = $reaction;
return $this;
}
...
}
Reaction
entity:
use AppEntityGut;
use AppRepositoryReactionRepository;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
#[ORMEntity(repositoryClass: ReactionRepository::class)]
class Reaction
{
public function __construct()
{
$this->guts = new ArrayCollection();
}
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 45)]
private ?string $reaction = null;
public function getId(): ?int
{
return $this->id;
}
public function getReaction(): ?string
{
return $this->reaction;
}
public function setReaction(string $reaction): self
{
$this->reaction = $reaction;
return $this;
}
#[ORMOneToMany(targetEntity: Gut::class, mappedBy: 'reaction')]
private $guts;
/**
* @return Collection|Product[]
*/
public function getGuts(): Collection
{
return $this->guts;
}
public function addGut($gut): self
{
$this->guts[] = $gut;
return $this;
}
public function __toString()
{
return $this->getReaction();
}
}
您的$reaction
属性不应该同时具有ORMColumn
和ORMJoinColumn
注释。
因为这个Doctrine认为它是一个常规列,所以它正在寻找一个基于变量名的数据库字段:$reaction
->gut.reaction
.
删除#[ORMColumn(length: 255)]
,然后确保你的数据库中有gut.reaction_id
,现在它应该工作了。
作为一个小旁注,我认为你不需要在ORMJoinColumn
中使用name: 'reaction_id', referencedColumnName: 'id'
因为Doctrine会自动为它们命名
就是放不下。我最终找到了让直觉和反应实体完美结合的方法。我做了什么:
- 克隆项目
- 手动删除Gut实体的反应属性;创建,执行迁移
- 在MySQL中,添加回反应列
- 使用
make:entity Gut
在反应上添加反应属性为ManyToOne;进行迁移 - 使用MySQL从克隆项目的数据库中填充反动_id列
- (可能在这里错过了一个步骤,但是)
gut->getReaction()
等,现在表现得像预期的那样-在多对一关系中。