Php 条令迁移:不可为空fk的默认值

Php 条令迁移:不可为空fk的默认值,php,doctrine-orm,foreign-keys,migration,default,Php,Doctrine Orm,Foreign Keys,Migration,Default,我在数据库中有一个实体。我想在此实体中添加一个新列: /** * @ORM\ManyToOne(targetEntity="Language") * @ORM\JoinColumn(name="language_id", referencedColumnName="id", nullable=false) */ protected $language; 当我现在使用“vendor/bin/doctor migrate migrations:diff”时,生成的迁移脚本不包含语言id的默认

我在数据库中有一个实体。我想在此实体中添加一个新列:

/**
 * @ORM\ManyToOne(targetEntity="Language")
 * @ORM\JoinColumn(name="language_id", referencedColumnName="id", nullable=false)
 */
protected $language;

当我现在使用
“vendor/bin/doctor migrate migrations:diff”
时,生成的迁移脚本不包含
语言id的默认值。因此,迁移脚本失败。为对象中的属性设置默认值没有帮助。如何为fk列定义默认值?我既没有在Doctrins文档中也没有通过google/stackoverflow找到任何东西。

如果列不为空,那么它应该表示一个有效的关系;假设您改用
0
,则条令将尝试使用它加载关联,这当然会失败。在这些情况下,需要更新数据库和映射以允许空值

但是,如果需要定义默认语言关联,则在创建实体时需要显式设置它

$language = $entityManager->find(1);

$entity = new Entity;
$entity->setLanguage($language);

$entityManager->persist($entity);
$entityManager->flush();

由于这个原因,你可能需要考虑一个“服务”,它封装了你的实体的创建,这样你就知道一个语言在默认情况下是有效的和赋值的。

< P>它可能不是一个干净的方法,但是你可以自己执行SQL查询并手动添加默认语句吗?p>
ALTER TABLE registered\u user ADD language\u id VARCHAR(255)NOT NULL DEFAULT{DEFAULT\u value}带有值


我很惊讶在注释中添加默认属性在这里不起作用

我遇到的问题与新条目无关,而是与现有条目有关。生成的迁移脚本不包含language_id的默认值,但包含NOTNULL约束。因此,迁移失败<代码>执行“ALTER TABLE registered\u user ADD language\u id VARCHAR(255)NOT NULL”时发生异常:SQLSTATE[23502]:NOT NULL冲突:7错误:列“language\u id”包含空值以增强我的请求:这里是运行迁移脚本时的确切消息:
执行“ALTER TABLE REGISTED_user ADD language_id VARCHAR(255)NOT null”时发生异常:SQLSTATE[23502]:NOT null冲突:7错误:列“language_id”包含空值
我现在已尝试此解决方案。问题:生成下一个迁移脚本时,默认值将被删除。是的,这只是为了添加列并更新现有行。我真的不知道为什么,但我也发现条令并没有管理SQL端的默认值。您必须在实体构造函数中设置默认值,以确保它始终存在(实体是否持久化)。如果这个默认值取决于一个配置参数,我建议您使用一个管理器(服务)来创建您的实体,就像上面的答案中建议的那样。