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

更改后,数据库中的Symfony实体不会更新,symfony,doctrine-orm,Symfony,Doctrine Orm,我的symfony应用程序正在使用Doctrine在mysql中持久化实体 今天,我更新了我的实体“广告客户”和“报告”,以便两者之间存在联系——正如本文所建议的: 当我尝试创建迁移时,它表示数据库已经同步 php bin/console make:migration 返回: [警告]未检测到数据库更改。 数据库架构和应用程序映射信息已同步 php bin/console make:migration 但是,如果我查看报告的表,我发现它仍然具有旧模式: +---------------+--

我的symfony应用程序正在使用Doctrine在mysql中持久化实体

今天,我更新了我的实体“广告客户”和“报告”,以便两者之间存在联系——正如本文所建议的:

当我尝试创建迁移时,它表示数据库已经同步

php bin/console make:migration
返回: [警告]未检测到数据库更改。 数据库架构和应用程序映射信息已同步

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

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

尝试使用正确的批注设置可能缺少必需的配置,您可以始终尝试使用
bin/console原则:架构:验证

/**
 * @ManyToOne(targetEntity="App\Entity\Advertiser", inversedBy="reports")
 * @JoinColumn(name="advertiser_id", referencedColumnName="id")
 */
private $advertiser;

并检查广告客户实体是否存在问题,可能它缺少主键或其他什么。

我认为问题在于我以前在报告对象上有一个名为“广告客户id”(int)的属性。可能是我试图一次改变太多的事情,以至于条令无法管理。以前,我在为广告客户添加relation属性时尝试删除广告客户id

为了让条令再次发挥作用,我从Report对象中删除了advertiser属性——以及getter和setter。我还从广告客户对象中删除了反向查找内容。当我尝试运行迁移时,似乎有几个迁移正在尝试运行——所有迁移都在做相同的事情:删除一个不存在的外键。因此,我注释掉了迁移文件中的所有这些命令,并最终能够让它迁移。我还删除了广告客户id属性。该应用程序再次运行

然后我尝试将“广告客户”关系属性添加回报告中。这次它按预期工作,我能够迁移。因此,我认为这个问题与我的对象已经拥有广告客户id属性有关。现在我已经将广告客户关系添加到了Report对象,我看到doctrine在表中添加了一个广告客户id列。我怀疑它之前的存在是事情发生故障的原因


谢谢你的回复!很高兴它能再次工作。

作为一种多对一关系,您的数据库广告客户列只将报告的键存储为指向它的“链接”是正常的,因此Symfony在您的数据库中看不到任何更改

也许你也可以使用:

php bin/console doctrine:schema:update --dump-sql 
查看数据库中的更改

php bin/console doctrine:schema:update --force 

要在不使用迁移的情况下应用更改,我遇到了相同的问题,请尝试使用以下命令清除缓存:

symfony console cache:clear

也许它对某些人有用,但是在使用注释时,请确保注释块遵循DocBlock格式,第一行应该有两个星号:
/**
,而不是一个星号
/*

DocBlock

/**
*
*/
PHP多行注释

/*
*
*
*/

运行您指定的命令,将生成以下结果:[确定]映射文件正确。[确定]数据库架构与映射文件同步。我不知道JoinColumn值是什么。我使用Symfony控制台来更改报告实体——将广告客户添加为关系类型,并在广告客户实体上设置反向,以便它可以获取报告。出现在我的SQL结果中的广告客户id字段是我的实体代码中不再存在的旧属性(但尚未从mysql中删除)。控制台添加到我的报告中的新属性称为“广告客户”——它是整个对象。所以我不认为在我的JoinColumn注释中包含广告客户id是必要的。也许我不明白问题出在哪里。但你们也必须修改和广告客户表,但你们并没有在这里发布它,所以我不能判断并没有广告客户实体代码有什么问题。你们现在有的是单向关联,你们需要的是双向关联。若您检索报告,您将看到附加到该报告的广告客户,但在检索广告客户时无法看到报告。请提供您的广告客户代码。问题不在于注释或代码。迁移出了一些问题-我相信是因为我已经有一个名为“advertiser_id”的字段,我在添加advertiser对象作为属性的同时删除了该字段。当我一次只做一步——首先删除广告客户id属性,迁移,然后使用bin/console make:entity添加相关的广告客户对象时,它按预期工作。如果它可以帮助其他人,对我来说,只是在我的entity类中设置了错误的名称空间。我从另一个包复制了一个实体,但忘记了更新名称空间。