更改后,Symfony实体不会在数据库中更新

时间:2019-02-12 15:53:21

标签: symfony doctrine-orm

我的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

如果您对如何使用更新的架构更新数据库有任何建议,请告诉我。

5 个答案:

答案 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 多行注释

/**
*
*/
相关问题