我使用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”更改。
答案 0 :(得分:1)
我记得在我的一个项目中遇到同样的问题。
根据答案中引用的注释,假设您拥有的大多数列都是布尔值。 MySQL将boolean类型视为TINYINT(1),当doctrine检查数据库模式以运行更新时,它会找到TINYINT(1),因此始终生成相同的查询集。
希望如果你想摆脱这个问题,这会有所帮助
答案 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