将列添加到Symfony中的现有实体

时间:2013-02-18 16:55:28

标签: php symfony doctrine-orm

我一直在我的网络服务器上玩Symfony,我一直在为我的数据库创建带有教义的实体。我想为这些实体中的一个添加一个列......我想做类似的事情:

php app/console doctrine:modify:entity

现在我知道这个命令不存在,但有一种方法(不进行整个迁移)只需添加一列。

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

9 个答案:

答案 0 :(得分:69)

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

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

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

  • 运行控制台命令

    php app/console doctrine:migrations:diff

  • 运行console命令(它会在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

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

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

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

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

答案 1 :(得分:9)

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

console doctrine:schema:update

这样,您的实体定义与数据库同步,您的数据库也会更新。

答案 2 :(得分: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

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

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

  1. 修改您的实体类(编辑实体文件)
  2. 清除元数据的Redis缓存(php app/console redis:flushdb
  3. 创建(可能是编辑)迁移(php app\console doctrine:migrations:diff
  4. 执行迁移(php app\console doctrine:migrations:migrate
  5. 当然,你的学说元数据缓存可能不是Redis,而是其他东西,比如app / cache中的文件或其他任何东西。别忘了考虑缓存清理。

    可能对某人有帮助。

答案 3 :(得分:3)

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

Symfony 4解决方案工作

示例:

在一个名称列中已经创建的

博客实体在那里,我想添加描述列。如此简单,输入

php bin/console make:entity Blog

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

FOR 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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分: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

答案 8 :(得分:0)

如果您需要将新字段属性添加到可以使用make:entity

的实体中,

$ php bin /控制台make:entity

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

“存在性”

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

说明

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

文本

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

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

(再次按Enter键完成)

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

信息