42

我一直在我的 Web 服务器上使用 Symfony,并且一直在为我的数据库创建具有原则的实体。我想向其中一个实体添加一列......我想做类似的事情:

php app/console doctrine:modify:entity

现在我知道这个命令不存在,但是有没有办法(不进行整个迁移)来简单地添加一列。

PS 我知道我可以打开 php 文件并在其中以文本方式添加列,然后更新架构,但我将其分发给一些客户端,我更喜欢“命令行式”的方法。

4

9 回答 9

83

实际上,使用 Doctrine 做你建议的事情根本没有意义。

Doctrine 是一个 ORM(对象关系映射)工具。这意味着你想从你的 PHP 代码中抽象出数据库,你将数据库的东西委托给 Doctrine。教义在这方面做得很好。

由于您想让您的客户/同行使用模型的最新版本更新,您应该使用 Doctrine Migrations ( http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html )。这就是管理数据库更新的方式。此外,它使您可以完全控制升级/降级数据库时的操作。例如,您可以在添加 FK 之前设置默认值。

在类上添加新属性的步骤应该是:

对于 Symfony 2:

  • 通过以下方式修改类:

    • Acme\MyBundle\Entity\Customer 并添加您想要的属性;

      Acme\MyBundle\Entity\Customer

    • 或修改学说文件:

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • 运行控制台命令(它将在类中添加正确的 set/get)

    php app/console doctrine:generate:entities AcmeMyBundle:Customer

  • 运行控制台命令

    php app/console doctrine:migrations:diff

  • 运行控制台命令(它将在 app/DoctrineMigrations 上放置一个新文件)

    php app/console doctrine:migrations:migrate

当您部署新版本的代码时,您所要做的就是更新源代码并运行上面的命令。

对于 Symfony 3:

  • 通过以下方式修改类:

    • Acme\MyBundle\Entity\Customer 并添加您想要的属性;

      Acme\MyBundle\Entity\Customer

    • 或修改学说文件:

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • 运行控制台命令(它将在类中添加正确的 set/get)

    php bin/console doctrine:generate:entities AcmeMyBundle:Customer

  • 运行控制台命令(更新数据库)

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

于 2013-02-18T17:44:52.393 回答
12

在 Symfony 的现有实体中添加新列。我有同样的问题。经过我长时间的研究,最好的解决方案就在那里。

Symfony 4 上的解决方案工作

例子:

已经在一个名称列中创建的博客实体在那里,我想添加描述列。这么简单的输入

php bin/console make:entity Blog

运行此命令后,您要添加新列

于 2019-08-05T09:30:17.867 回答
10

您肯定想要打开定义实体的 PHP/XML/YML 文件并在其中添加列。然后,您使用命令行并说

console doctrine:schema:update

这样,您的实体定义与数据库同步并且您的数据库得到更新。

于 2013-02-19T00:10:12.493 回答
4

php app/console doctrine:migrations:diff使用学说迁移时,上述步骤存在一个陷阱。

您对实体进行了更改,一切似乎都有效,但创建迁移的命令显示php app/console doctrine:migrations:diff“在您的映射信息中未检测到更改”。

而且你找不到旧的数据库结构放在哪里,在文件中搜索一无所获。

对我来说,关键是清除 Redis 缓存。

php app/console redis:flushdb

这是因为 config.yml

snc_redis:
    clients:
        default:
            type: predis
            alias: default
            dsn: redis://localhost
    doctrine:
        query_cache:
            client: default
            entity_manager: default
            namespace: "%kernel.root_dir%"
        metadata_cache:
            client: default
            entity_manager: default
            document_manager: default
            namespace: "%kernel.root_dir%"
        result_cache:
            client: default
            namespace: "%kernel.root_dir%"
            entity_manager: [default, read]  # you may specify multiple entity_managers

之后, migrations:diff 重新读取所有实体(而不是从缓存中取出过时的元数据)并创建正确的迁移。


因此,修改实体的完整步骤链是:

  1. 修改你的实体类(编辑实体文件)
  2. 清除 Redis 元数据缓存 ( php app/console redis:flushdb)
  3. 创建(并且可能是编辑)迁移 ( php app\console doctrine:migrations:diff)
  4. 执行迁移 ( php app\console doctrine:migrations:migrate)

当然,您的学说元数据缓存可能不是 Redis,而是其他东西,例如 app/cache 中的文件或其他任何东西。不要忘记考虑缓存清除。

可能对某人有帮助。

于 2016-05-12T10:32:40.667 回答
2

我找到了一种在 YourBundle/Resources/Config/doctrine/Yourentity.orm.yml 中添加新列的方法。

然后在 Entity 类中添加 getter 和 setter 方法。

然后php app/console doctrine:schema:update --force从控制台做。它对我有用。

于 2015-09-23T13:51:11.290 回答
1

如果您需要向现有实体添加新字段属性,您可以使用 make:entity

$ php bin/控制台 make:entity

要创建或更新的实体的类名

“存在”

新属性名称(按下停止添加字段):

描述

字段类型(输入?查看所有类型)[字符串]:

文本

该字段在数据库中是否可以为空(可为空)(是/否)[否]:

新属性名称(按下停止添加字段):

(再次按回车键完成)

https://symfony.com/doc/current/doctrine.html提取的信息

于 2020-10-18T16:31:17.433 回答
1

对于 SYMFONY3 用户...

在这里,您必须按照两个步骤对您的实体进行更改第 1 步:打开您的实体文件..对于 EX:“Acme\MyBundle\Entity\Book”

当前实体只有几个字段,例如:id、name、title 等。现在,如果您想添加“image”的新字段并更改“title”字段的约束,然后使用 getter 和 setter 添加“image”字段

/**
     * @var string
     *
     * @ORM\Column(name="image", type="string", length=500)
     */
    private $image;

并添加 getter 和 setter

/**
     * Set image
     *
     * @param string $image
     *
     * @return Book
     */
    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return string
     */
    public function getimage()
    {
        return $this->image;
    }

将标题的现有字段约束从长度 255 更新为 500

/**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=500)
     */
    private $title;

好的...您已根据需要进行了更改,而您仅一步之遥。

第 2 步:在项目目录中触发此命令

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

现在,检查数据库中的表,完成!

于 2016-12-13T10:17:44.563 回答
0

我认为,您需要手动更新关系表以映射关系。我发现了这个:讨论

同样,我们可以从现有数据库中生成实体,作为一个整体,但单独?:(

于 2013-02-18T17:17:17.403 回答
0

这就是它对我的工作方式:

  • 在现有类中添加新的 vars、setter 和 getter:
    src-->AppBundle-->Entity-->YourClassName.php
  • 更新 ORM 文件:
  src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
  • 运行 bash 命令:
  php bin/console doctrine:schema:update --force
于 2017-12-15T15:09:57.800 回答