Php 向Symfony中的现有实体添加列

Php 向Symfony中的现有实体添加列,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我一直在我的web服务器上玩Symfony,我一直在为我的数据库创建entity with doctrine。我想在这些实体中添加一列。。。我想做一些事情,比如: php app/console doctrine:modify:entity 现在我知道这个命令不存在,但是有没有一种方法(不进行整个迁移)可以简单地添加一个列 另外,我知道我可以打开php文件并以文本方式在其中添加列,然后更新模式,但我正在将其分发给一些客户机,我喜欢更“类似命令行”的方法。我认为,您需要手动更新关系表以映射关系。

我一直在我的web服务器上玩Symfony,我一直在为我的数据库创建entity with doctrine。我想在这些实体中添加一列。。。我想做一些事情,比如:

php app/console doctrine:modify:entity
现在我知道这个命令不存在,但是有没有一种方法(不进行整个迁移)可以简单地添加一个列


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

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


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

事实上,用条令来做你建议的事情毫无意义

Doctrine是一个ORM(对象关系映射)工具。它意味着你想从PHP代码中提取数据库,你可以将数据库的内容委托给Doctrine。Doctrine在这方面做得很好

由于您希望使用最新版本的模型不断更新您的客户/同行,您应该使用Doctrine Migrations()。这是管理数据库更新的方法。此外,它使您能够完全控制升级/降级数据库时的操作。例如,您可以在添加FK之前设置默认值

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

对于Symfony 2:

  • 通过以下方式修改类:

    • Acme\MyBundle\Entity\Customer并添加所需的属性

      Acme\MyBundle\Entity\Customer

    • 或修改条令文件:

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

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

    php应用程序/控制台原则:生成:实体AcmeMyBundle:Customer

  • 运行控制台命令

    php应用程序/控制台原则:迁移:diff

  • 运行console命令(它将在app/doctrin上放置一个新文件)

    php应用程序/控制台原则:迁移:迁移

在部署新版本的代码时,只需更新源代码并运行上面的命令

对于Symfony 3:

  • 通过以下方式修改类:

    • Acme\MyBundle\Entity\Customer并添加所需的属性

      Acme\MyBundle\Entity\Customer

    • 或修改条令文件:

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

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

    php bin/console原则:生成:实体AcmeMyBundle:Customer

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

    php bin/console原则:模式:更新--force


您肯定希望打开定义实体的PHP/XML/YML文件,并在其中添加列

console doctrine:schema:update

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

我找到了一种方法,在YourBundle/Resources/Config/doctor/yourtentity.orm.yml中添加了新列

然后在实体类中添加了getter和setter方法


然后做了
php应用程序/控制台原则:schema:update——从控制台强制执行
。这对我很有效。

在使用原则迁移时,上面描述的步骤
php应用程序/控制台原则:迁移:diff
存在一个陷阱

您在实体中进行了更改,所有这些似乎都是有效的,但是关于创建迁移的命令
php应用程序/控制台条令: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重新读取所有实体(而不是从缓存中获取过时的元数据),并创建正确的迁移


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

  • 修改实体类(编辑实体文件)
  • 清除元数据的Redis缓存(
    php应用程序/控制台Redis:flushdb
  • 创建(也可以编辑)迁移(
    php-app\console原则:迁移:diff
  • 执行迁移(
    php-app\console原则:迁移:迁移
  • 当然,你的元数据缓存可能不是Redis,而是其他东西,比如app/cache中的文件或其他任何东西。别忘了考虑缓存清除

    可能对某人有帮助。

    对于SYMFONY3用户。。。 在这里,您必须遵循两个步骤对实体进行更改 步骤1:打开实体文件..例如:“Acme\MyBundle\Entity\Book”

    当前实体只有几个字段,如:id、名称、标题等。 现在,如果您想添加“image”的新字段,并对“title”字段进行更改约束,那么可以使用getter和setter添加“image”字段

    /**
         * @var string
         *
         * @ORM\Column(name="image", type="string", length=500)
         */
        private $image;
    
    /**
         * 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;
        }
    
    并添加getter和setter

    /**
         * @var string
         *
         * @ORM\Column(name="image", type="string", length=500)
         */
        private $image;
    
    /**
         * 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 好的…你已经根据你的需要做出了改变,你离改变只有一步之遥

    步骤2:在项目目录中激发此命令

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

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

    这就是我的工作方式:

    • 在现有类中添加新的变量、setter和getter:
    • 更新ORM文件:
    • 运行bash命令:
    在Symfony上的现有实体中添加新列。我也有同样的问题。在我长期研究之后,最好的解决方案就出现了

    Symfony 4的解决方案工作

    示例:

    博客实体已在一个名称中创建
      src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
    
      php bin/console doctrine:schema:update --force
    
    php bin/console make:entity Blog