使用 docrine 模式在 symfony 中的另一列之后添加新列

Posted

技术标签:

【中文标题】使用 docrine 模式在 symfony 中的另一列之后添加新列【英文标题】:add new column after another column in symfony using docrine schema 【发布时间】:2020-08-24 12:48:09 【问题描述】:

代码

房间桌子的实体。

use Doctrine\ORM\Mapping as ORM;

class Room

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

   /**
     * @var int
     *
     * @ORM\Column(type="integer")
     */
    private $groupOrder;

    /**
     * @var boolean
     *
     * @ORM\Column(type="boolean", options="after": "active","default": false)
     */
    private $isAssociable;

    /**
     * @var bool
     *
     * @ORM\Column(type="boolean", options="default" : 1)
     */
    private $active = true;

    /**
     * @var \DateTime
     *
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(type="datetime")
     */
    private $updatedAt;

我正在控制台上运行以下命令,但输出不符合预期

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

预期输出

ALTER TABLE room ADD is_associable TINYINT(1) DEFAULT '0' NOT NULL 活动后;

我得到了什么(输出)

ALTER TABLE room ADD is_associable TINYINT(1) DEFAULT '0' NOT NULL;

【问题讨论】:

Doctrine 不支持这一点,因为“...Doctrine 被构建为尽可能与数据存储无关。从数据的角度来看,放置新列并不重要是否处于特定位置,......” @JasonStephenson 除了迁移之外还有什么替代方法吗? 我不知道,除非你在教义之外手动操作,抱歉 我想我应该通过迁移来做到这一点:P,谢谢@JasonStephenson 如果您是生产数据库,则必须手动执行。唯一的另一种方法是在文件中订购您的属性,删除表,更新架构 【参考方案1】:

在 Doctrine 中,您似乎无法做到这一点。可能处理的列的选项参数不可用。无论如何,也许你可以通过(当然所有的想法都是一种变通方法)来实现:

为字段创建自定义“位置”注释,当然您需要编写自定义命令,该命令将运行doctrine:schema:update --dump-sql 并修改 sql 输出(这只是我的想法)。

使用迁移来执行此操作,您将在其中放置原始 sql

在 github here 上为 Doctrine ORM 项目创建 PR 或 Issue。

【讨论】:

以上是关于使用 docrine 模式在 symfony 中的另一列之后添加新列的主要内容,如果未能解决你的问题,请参考以下文章

未处理模态中的 Symfony2 表单

如何在 Symfony 2 中进入维护模式以安全地更新生产应用程序?

在禁用调试模式的情况下对我的 Symfony 5 应用程序的 API 调用返回 CORS 错误

禁用生产 Symfony 中的错误

Symfony 2 FOS 用户捆绑引导模式 AJAX 登录

Symfony2 / Doctrine2:不要在模式上删除全文索引:更新