如何在原则2中设置默认值?
当前回答
我使用的解决方法是LifeCycleCallback。仍然在等待是否有更多的“原生”方法,例如@Column(type="string", default="hello默认值")。
/**
* @Entity @Table(name="posts") @HasLifeCycleCallbacks
*/
class Post implements Node, \Zend_Acl_Resource_Interface {
...
/**
* @PrePersist
*/
function onPrePersist() {
// set default date
$this->dtPosted = date('Y-m-d H:m:s');
}
其他回答
我使用的解决方法是LifeCycleCallback。仍然在等待是否有更多的“原生”方法,例如@Column(type="string", default="hello默认值")。
/**
* @Entity @Table(name="posts") @HasLifeCycleCallbacks
*/
class Post implements Node, \Zend_Acl_Resource_Interface {
...
/**
* @PrePersist
*/
function onPrePersist() {
// set default date
$this->dtPosted = date('Y-m-d H:m:s');
}
虽然在构造函数中设置值可以工作,但使用Doctrine Lifecycle事件可能是更好的解决方案。
通过利用prePersist生命周期事件,您可以仅在初始持久化时为您的实体设置默认值。
为@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");
有了这个答案,我鼓励您思考一下,为什么首先需要数据库中的默认值?通常它允许创建非空约束的对象。
这些对我都没用。我在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;
这将插入我想要的值。
更新
阅读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的Flash游戏高分表的最佳方法是什么
- PHP子字符串提取。获取第一个'/'之前的字符串或整个字符串
- __construct函数的作用是什么?
- PHP中的异步shell执行器
- Laravel 5 -如何访问在视图存储上传的图像?
- 为什么在PHP中使用sprintf函数?
- “质量分配”在Laravel中是什么意思?
- 在逗号上爆炸字符串,并修剪每个值的潜在空格
- PHP与MySQL 8.0+错误:服务器请求身份验证方法未知的客户端
- laravel5“LIKE”对等物(雄辩的)
- 在函数中使用默认实参
- 转换php数组到Javascript
- PHP PDO:字符集,集名称?
- PHP函数生成slug (URL字符串)
- 如何在JPA中持久化类型列表<字符串>的属性?