【问题标题】:Add a column to an existing entity in Symfony向 Symfony 中的现有实体添加列
【发布时间】:2013-02-03 04:22:14
【问题描述】:

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

php app/console doctrine:modify:entity

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

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

【问题讨论】:

  • 用代码来做。 ORM 的生成器工具不应该被这样滥用。

标签: php symfony doctrine-orm


【解决方案1】:

实际上,使用 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

【讨论】:

  • 一个低声望的人试图通过编辑添加这个;我会把它放在这里,因为这可能会有所帮助:for php bin/console doctrine:schema:update --force: WARNING official docs 建议不要在生产环境中使用它!
  • 为什么我们不使用 Symfony 3 的迁移?
【解决方案2】:

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

console doctrine:schema:update

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

【讨论】:

    【解决方案3】:

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

    Symfony 4 上的解决方案

    示例:

    已经在一个 name 列中创建了博客实体,我想添加 description 列。这么简单的输入

    php bin/console make:entity Blog
    

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

    【讨论】:

      【解决方案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 中的文件或其他任何东西。不要忘记考虑清除缓存。

      可能对某人有帮助。

      【讨论】:

      • 哇,这出乎意料,尤其是cache:clear 没有解决问题,但 redis flush 解决了。
      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        对于 SYMFONY3 用户...

        在这里,您必须按照两个步骤来更改您的实体 第 1 步:打开您的实体文件。例如:“Acme\MyBundle\Entity\Book”

        当前实体的字段很少,例如:id、name、title 等。 现在,如果您想添加“图像”的新字段并对“标题”字段进行更改约束,则使用 getter 和 setter 添加“图像”字段

        /**
             * @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
        

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

        【讨论】:

        • 对我不起作用 :( 。尝试更新字段的长度。现在收到错误:编译错误:无法声明类 ClassName,因为该名称已在使用中。(注意:类名不是实际的类名)
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          这对我来说是这样的:

          • 在现有类中添加新的 var、setter 和 getter:
              src-->AppBundle-->Entity-->YourClassName.php
          
          • 更新 ORM 文件:
            src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
          
          • 运行 bash 命令:
            php bin/console doctrine:schema:update --force
          

          【讨论】:

            【解决方案9】:

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

            $ php bin/console make:实体

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

            “存在性”

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

            说明

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

            文字

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

            没有

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

            (再次按回车键完成)

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

            【讨论】:

              猜你喜欢
              • 2015-02-11
              • 2017-07-25
              • 2015-11-01
              • 2019-08-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-15
              相关资源
              最近更新 更多