Doctrine doctrine:schema:update命令一次又一次地生成相同的查询集

时间:2015-10-21 13:15:17

标签: php mysql symfony doctrine-orm doctrine

我使用Doctrine 2.2.3和Symfony 2.0.12,我对Doctrine有问题,当我启动doctrine时:schema:update它会一次又一次地生成相同的查询集,如下所示:

ALTER TABLE Testimonial CHANGE frontPage frontPage TINYINT(1) NOT NULL;
ALTER TABLE Slider CHANGE active active TINYINT(1) DEFAULT NULL;
ALTER TABLE LPSlider CHANGE active active TINYINT(1) DEFAULT NULL;
ALTER TABLE CustomerDesign CHANGE requestProof requestProof TINYINT(1) DEFAULT NULL, CHANGE isBlank isBlank TINYINT(1) DEFAULT NULL, CHANGE hidden hidden TINYINT(1) DEFAULT NULL;
ALTER TABLE SessionDesign CHANGE requestProof requestProof TINYINT(1) DEFAULT NULL, CHANGE isBlank isBlank TINYINT(1) DEFAULT NULL;

而且,正如你所看到的那样,只有“TINYINT(1)DEFAULT NULL”发生变化,如果我用--force运行命令,它会成功更新模式:

Database schema updated successfully! "30" queries were executed

但如果我再次运行doctrine:schema:update --dump -sql它显示相同的查询,我检查了数据库,所有这些字段已经“TINYINT(1)DEFAULT NULL”。

我使用PHP实体注释,例如:

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

我无法将Doctrine更新为v2.3或更高版本,它不适用于我的Symfony版本,更新Symfony可能真的很痛苦,因为这是一个非常庞大的项目。

更新

我设法将应用程序升级到最新版本的Symfony 2.7.5和Doctrine 2.5.1并仍然存在相同的问题,尝试使用doctrine创建新数据库:schema:create,但是doctrine:schema:update再次显示相同的“TINYINT(1)NOT NULL”更改。

2 个答案:

答案 0 :(得分:1)

我记得在我的一个项目中遇到同样的问题。

根据答案中引用的注释,假设您拥有的大多数列都是布尔值。 MySQL将boolean类型视为TINYINT(1),当doctrine检查数据库模式以运行更新时,它会找到TINYINT(1),因此始终生成相同的查询集。

希望如果你想摆脱这个问题,这会有所帮助

积分转到:https://stackoverflow.com/a/4237773/2154099

答案 1 :(得分:1)

好的,我终于找到了问题,在配置文件中,由于某种原因,类型tinyint被手动映射到smallint:

doctrine:
    dbal:
        driver:   %database_driver%
        host:     %database_host%
        port:     %database_port%
        dbname:   %database_name%
        user:     %database_user%
        password: %database_password%
        charset:  UTF8
        mapping_types:
            enum: string
            tinyint: smallint # this is what caused all the problems with booleand fields