如何在原则2中设置默认值?
当前回答
虽然在构造函数中设置值可以工作,但使用Doctrine Lifecycle事件可能是更好的解决方案。
通过利用prePersist生命周期事件,您可以仅在初始持久化时为您的实体设置默认值。
其他回答
这些对我都没用。我在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;
这将插入我想要的值。
为@romanb的精彩回答锦上添花。
这在迁移中增加了一点开销,因为您显然不能创建一个非空约束且没有默认值的字段。
// this up() migration is autogenerated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() != "postgresql");
//lets add property without not null contraint
$this->addSql("ALTER TABLE tablename ADD property BOOLEAN");
//get the default value for property
$object = new Object();
$defaultValue = $menuItem->getProperty() ? "true":"false";
$this->addSql("UPDATE tablename SET property = {$defaultValue}");
//not you can add constraint
$this->addSql("ALTER TABLE tablename ALTER property SET NOT NULL");
有了这个答案,我鼓励您思考一下,为什么首先需要数据库中的默认值?通常它允许创建非空约束的对象。
如果对实体使用yaml定义, 以下工作为我在postgresql数据库:
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: boolean
nullable: false
options:
default: false
更新
阅读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()了解更多细节)。
在实体中设置一个构造函数,并在那里设置默认值。
推荐文章
- 获取PHP中的URL参数
- 致命错误:类“ZipArchive”未在
- 设置cookie永不过期
- '<是什么?=' PHP中的意思?
- PHP中的echo和print有什么不同?
- 我如何使用Guzzle发送一个POST请求JSON?
- 如何POST JSON数据与PHP卷曲?
- 在Doctrine QueryBuilder中计算行数
- 在PHP中使用getter和setter而不是函数或简单的公共字段有什么优点?
- 非加密用途的最快哈希?
- 将变量传递到下一页
- 使用curl在PHP中获取HTTP代码
- 如何删除数组元素,然后重新索引数组?
- 如何从PHP调用JavaScript函数?
- 确定PHP中是否存在数组键的更快更好的方法是什么?