Doctrine中的默认值
(Default value in Doctrine)这个问题的出现的原因是在Doctrine中设置默认值的方式存在一些限制和问题。解决方法是根据Doctrine的推荐方案,通过在实体的构造函数中设置默认值来解决这个问题。
首先,某些情况下在实体的构造函数中设置默认值是一种逻辑上的方法。但是,有人表示在构造函数中设置默认值会遇到问题。这可能是因为构造函数只在创建新实体时被调用,而不会对已存在的实体进行更新。
然后,某些情况下Doctrine的推荐解决方案是使用doctrine-project.org/docs/orm/2.1/en/reference/faq.html中的方法。然而,也有人表示这种方法不能更新已存在的实体,如果添加了需要有默认值的新字段,就无法更新现有实体。
此外,还有人指出,即使对于整数字段,如果想要通过清空字段来恢复默认值,这种方法也无法实现。这可能是因为默认值的设置方式不支持这种操作。
最后,有人提供了一个新的链接doctrine-project.org/projects/doctrine-orm/en/2.6/reference/…,指向了关于这个主题的FAQ页面。
为了解决在Doctrine中设置默认值的问题,可以根据Doctrine的推荐方案,在实体的构造函数中设置默认值。然而,需要注意构造函数只在创建新实体时被调用,不会对已存在的实体进行更新。如果需要更新已存在的实体,可能需要使用其他方法。此外,需要注意默认值的设置方式可能无法支持通过清空字段来恢复默认值的操作。
Doctrine中的默认值问题出现的原因是数据库默认值不受"便携"支持。使用数据库默认值的唯一方法是通过columnDefinition映射属性,在其中指定字段映射到的列的SQL片段(包括DEFAULT语句)。
解决方法是使用PHP级别的默认值,因为这些值在新创建和持久化的对象上也可以正常使用(在将新对象持久化到数据库后,Doctrine不会再返回数据库获取默认值)。
然而,如果设置了"datetime"类型会有一个问题。在实体构造函数中设置实例化值。
使用这种方法时要小心迁移。因为任何现有的行都会导致迁移失败。
如果添加新列,迁移不会将此默认值设置为已存在的行,除非它们要设置为null。可能现有行希望有一个特殊值,而不是新行的默认值。
在迁移过程中,如果添加的字段是nullable=true,那么在调用doctrine:schema:update后,更新的数据库中该字段将显然为NULL(这是预期的行为)。而如果添加的字段是nullable=false,那么整数(类似)列的值将初始化为0。还没有尝试varchar类型。并且在调用schema:update之后,实际上需要调用单独的脚本,该脚本将处理所有行并为字段设置有效值。有关迁移的其他建议吗?
在更新时,如果不包含该字段的保存/原始值,它将始终被类变量(默认值)覆盖。
不要使用实例化区域来设置变量... 相信我,会发生糟糕的事情。请改用构造函数区域。
我建议在注解中使用columnDefinition,否则可能会有人使用mysql客户端或phpmyadmin,导致值错误。
在我看来,这不是默认值,只是初始值。如果编辑实体并添加一个新列,并且想要设置默认值,它不会被设置为旧条目,只会被设置为新条目。所以,iv3ndy的答案是正确的,如果你想要一个真正的默认值。
如果不想在不可为空的字段上破坏迁移,还需要添加选项{"default" : 0}。
(Default value in Doctrine)问题的出现的原因是,原始的Doctrine文档中没有提到如何设置默认值。然而,通过一些探索和实践,开发者们发现了一种设置默认值的方法,并在Stack Overflow等平台上分享了这个解决方案。
解决方法是在实体类的属性上使用注解来设置默认值。可以使用options
参数,并在参数中设置default
的值为所需的默认值。此外,该参数还可以用于设置unsigned
的值。需要注意的是,这种方法只适用于某些字段类型,如BLOB
和TEXT
字段。
在使用迁移工具进行迁移时,这种设置默认值的方法非常有用,因为迁移工具只扫描注解/元数据,而不会扫描PHP默认值。这样可以确保在迁移过程中不会丢失默认值的设置。
尽管这个方法非常实用,但需要注意的是,它可能在后续的Doctrine版本中被删除,因为它是一个未经官方文档支持的功能。因此,使用这个方法的开发者需要时刻关注Doctrine的更新和变化。
总结起来,通过注解设置默认值是一种有效的解决方法,尽管它可能存在一些限制和潜在的风险。开发者们可以根据自己的需求和情况来选择是否使用这种方法来设置默认值。