我的symfony应用程序正在使用Doctrine在mysql中保留实体。
今天我更新了我的实体“广告商”和“报告”,因此两者之间存在联系-如本文所建议:When using EntityType to show a select, can't save entity from Symfony form
当我尝试创建迁移时,它表示数据库已经同步。
php bin/console make:migration
返回: [警告]未检测到数据库更改。 数据库架构和应用程序映射信息已经同步。
但是,如果我查看报表表,我仍然看到它具有旧的架构:
+---------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| advertiser_id | int(11) | NO | MUL | NULL | |
| start_date | date | NO | | NULL | |
| end_date | date | NO | | NULL | |
| deleted | tinyint(1) | NO | | NULL | |
+---------------+------------+------+-----+---------+----------------+
即使我的实体现在看起来像这样:
class Report
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="date")
*/
private $start_date;
/**
* @ORM\Column(type="date")
*/
private $end_date;
/**
* @ORM\Column(type="boolean")
*/
private $deleted;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Advertiser", inversedBy="reports")
* @ORM\JoinColumn(nullable=false)
*/
private $advertiser;
public function getId(): ?int
{
return $this->id;
}
public function getStartDate(): ?\DateTimeInterface
{
return $this->start_date;
}
public function setStartDate(\DateTimeInterface $start_date): self
{
$this->start_date = $start_date;
return $this;
}
public function getEndDate(): ?\DateTimeInterface
{
return $this->end_date;
}
public function setEndDate(\DateTimeInterface $end_date): self
{
$this->end_date = $end_date;
return $this;
}
public function getDeleted(): ?bool
{
return $this->deleted;
}
public function setDeleted(bool $deleted): self
{
$this->deleted = $deleted;
return $this;
}
public function getAdvertiser(): ?Advertiser
{
return $this->advertiser;
}
public function setAdvertiser(?Advertiser $advertiser): self
{
$this->advertiser = $advertiser;
return $this;
}
}
我一直在寻找解决方案,并尝试过这些方法,但是没有运气:
php bin/console doctrine:cache:clear-metadata
php bin/console doctrine:schema:update --force
如果您对如何使用更新的架构更新数据库有任何建议,请告诉我。
答案 0 :(得分:1)
我遇到了同样的问题,请尝试使用以下命令清除缓存:
symfony console cache:clear
答案 1 :(得分:0)
尝试使用正确的注释设置可能会缺少必需的配置,您随时可以尝试使用bin/console doctrine:schema:validate
验证模式:
/**
* @ManyToOne(targetEntity="App\Entity\Advertiser", inversedBy="reports")
* @JoinColumn(name="advertiser_id", referencedColumnName="id")
*/
private $advertiser;
还要检查广告商实体是否存在问题,也许它缺少主键之类的东西。
答案 2 :(得分:0)
我认为问题是我以前在报表对象上拥有一个名为“ advertiser_id”(int)的属性。可能我正在尝试一次更改太多东西以使该学说无法处理。以前,我曾尝试在添加广告客户的关联属性时删除Advertiser_id。
为使该理论再次起作用,我从Report对象中删除了广告商属性-以及getter和setter。我还从Advertiser对象中删除了反向查找的内容。当我尝试运行迁移时,似乎正在尝试运行多个迁移-都在做相同的事情:删除不存在的外键。因此,我注释掉了迁移文件中的所有这些命令,最终使它能够迁移。我还删除了advertiser_id属性。该应用程序再次正常工作。
然后,我尝试将“广告商”关系属性添加回报表中。这次,它按预期工作,并且能够迁移。因此,我认为问题与我的对象已经具有adser_id属性有关。现在,我已经将广告客户关系添加到了报表对象,我看到该原则在表中添加了一个advertiser_id列。我怀疑以前是它出现的原因,这是事情崩溃的原因。
感谢您的答复!很高兴再次使用它。
答案 3 :(得分:0)
作为多对一关系,通常您是数据库广告客户列,它仅将报告的键存储为指向该键的“链接”,因此这就是Symfony没有看到任何键的原因。数据库中的更改。
也许您也可以使用:
php bin/console doctrine:schema:update --dump-sql
查看数据库中的更改
php bin/console doctrine:schema:update --force
无需更改即可应用更改
答案 4 :(得分:0)
也许它对某人有用,但是在使用注释时确保注释块遵循 DocBlock 格式,第一行应该有两个星号:/**
而不是单个星号 { {1}}
文档块
/*
PHP 多行注释
/**
*
*/