Объекты Symfony не обновляются в базе данных после изменений - PullRequest
0 голосов
/ 12 февраля 2019

Мое приложение Symfony использует Doctrine для сохранения сущностей в mysql.

Сегодня я обновил свои сущности "Рекламодатель" и "Отчет", чтобы между ними были взаимосвязи - как предлагается в этом посте: При использовании EntityType для отображения выбора не удается сохранить сущность из формы Symfony

Когда я пытаюсь создать миграцию, он говорит, что база данных уже синхронизирована.

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

Пожалуйста, дайте мне знать, если у вас есть какие-либо предложенияо том, как я могу обновить свою базу данных с моей обновленной схемой.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я считаю, что проблема заключалась в том, что у меня ранее было свойство с именем "advertiser_id" (int) в объекте отчета.И, возможно, я пытался изменить слишком много вещей одновременно, чтобы доктрина могла справиться.Ранее я пытался удалить рекламодатель_ид при добавлении свойства отношения для рекламодателя.

Чтобы снова заставить работать доктрину, я удалил свойство рекламодателя из объекта отчета - вместе с получателями и установщиками.Я также удалил материал обратного поиска из объекта Advertiser.Когда я попытался запустить миграцию, мне показалось, что было несколько миграций, которые он пытался запустить, и все они делали одно и то же: отбрасывание внешнего ключа, который не существует.Поэтому я закомментировал все эти команды в файлах миграции и, наконец, смог их перенести.Я также удалил свойство advertiser_id.Приложение снова работает.

Затем я попытался добавить свойство отношения "рекламодатель" обратно в отчет.На этот раз все сработало, как и ожидалось, и я смог мигрировать.Поэтому я думаю, что проблема связана с тем, что у моего объекта уже есть свойство advertiser_id.Теперь, когда я добавил отношение рекламодателя к объекту отчета, я вижу, что доктрина добавила столбец advertiser_id в таблицу.Я подозреваю, что он присутствовал ранее и был причиной поломки.

Спасибо за ответы!Рад, что он снова работает.

0 голосов
/ 13 февраля 2019

Как отношение многие к одному , это нормально, что ваш столбец рекламодателя базы данных хранит только ключ отчета как «ссылку» на него, поэтому Symfony не видит никаких измененийв вашей БД.

Возможно, вы также можете использовать:

php bin/console doctrine:schema:update --dump-sql 

, чтобы увидеть изменения в вашей БД

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

, чтобы применить изменения без использования миграций

0 голосов
/ 12 февраля 2019

Попробуйте использовать правильную настройку аннотации, возможно, отсутствует необходимая конфигурация, вы всегда можете попробовать проверить схему с помощью bin/console doctrine:schema:validate:

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

и проверить сущность Advertiser на наличие проблем, возможно, в ней отсутствует основнаяключ или что-то.

...