如何在原则2中设置默认值?
当前回答
工作对我的mysql数据库也:
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: integer
nullable: true
options:
default: 1
其他回答
这些对我都没用。我在doctrine的网站上找到了一些文档,上面说直接设置值来设置默认值。
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/faq.html#how-can-i-add-default-values-to-a-column
private $default = 0;
这将插入我想要的值。
使用:
options={"default":"foo bar"}
而不是:
options={"default"="foo bar"}
例如:
/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
更新
阅读Symfony文档永远不会过时的另一个原因是。对于我的特定情况,有一个简单的解决方案,就是将字段类型选项empty_data设置为默认值。
同样,此解决方案仅适用于表单中的空输入将DB字段设置为null的场景。
背景
前面的答案对我的具体情况没有任何帮助,但我找到了一个解决方案。
我有一个表单字段,需要表现如下:
不是必需的,可以留空。(使用'required' => false) 如果为空,则默认为给定值。为了更好的用户体验,我没有在输入字段上设置默认值,而是使用html属性“占位符”,因为它不那么突兀。
然后我尝试了这里给出的所有建议。让我列出它们:
为entity属性设置默认值:
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
使用options注释:
@ORM\Column(name="foo", options={"default":"foo bar"})
在构造函数上设置默认值:
/**
* @Entity
*/
class myEntity {
...
public function __construct()
{
$this->myColumn = 'myDefaultValue';
}
...
}
None of it worked and all because of how Symfony uses your Entity class.
重要的
Symfony表单字段覆盖在Entity类上设置的默认值。 这意味着,您的数据库模式可以定义一个默认值,但如果您在提交表单时留下一个非必需字段为空,那么form->handleRequest()在您的form->isValid()方法将覆盖您的Entity类上的这些默认值,并将它们设置为输入字段值。如果输入字段值为空,则将Entity属性设置为空。
http://symfony.com/doc/current/book/forms.html#handling-form-submissions
我的解决方案
在你的form->handleRequest()后在你的form->isValid()方法上设置默认值:
...
if ($myEntity->getMyColumn() === null) {
$myEntity->setMyColumn('myDefaultValue');
}
...
这不是一个漂亮的解决方案,但很有效。我可能会建立一个验证组,但可能有人认为这个问题是数据转换,而不是数据验证,我把它留给你来决定。
覆盖设置器(不工作)
我还尝试以这种方式覆盖实体setter:
...
/**
* Set myColumn
*
* @param string $myColumn
*
* @return myEntity
*/
public function setMyColumn($myColumn)
{
$this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;
return $this;
}
...
这个,虽然看起来更干净,但它不起作用。原因是邪恶的form->handleRequest()方法没有使用Model的setter方法来更新数据(深入form->setData()了解更多细节)。
在实体中设置一个构造函数,并在那里设置默认值。
你也可以使用xml:
<field name="acmeOne" type="string" column="acmeOne" length="36">
<options>
<option name="comment">Your SQL field comment goes here.</option>
<option name="default">Default Value</option>
</options>
</field>