如何在原则2中设置默认值?
当前回答
更新
阅读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()了解更多细节)。
其他回答
在实体中设置一个构造函数,并在那里设置默认值。
数据库默认值不支持“可移植”。使用数据库默认值的唯一方法是通过columnDefinition映射属性,在该属性中为字段映射到的列指定SQL片段(包括default原因)。
你可以使用:
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
php级别的默认值是首选的,因为这些值在新创建的和持久化的对象上也是正确可用的(在持久化一个新对象后,Doctrine不会返回数据库以获得默认值)。
这些对我都没用。我在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;
这将插入我想要的值。
我也遇到过同样的问题。我希望将数据库中的默认值(自动地)放入实体中。你猜怎么着,我做到了。
<?php
/**
* Created by JetBrains PhpStorm.
* User: Steffen
* Date: 27-6-13
* Time: 15:36
* To change this template use File | Settings | File Templates.
*/
require_once 'bootstrap.php';
$em->getConfiguration()->setMetadataDriverImpl(
new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
$em->getConnection()->getSchemaManager()
)
);
$driver = new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager());
$driver->setNamespace('Models\\');
$em->getConfiguration()->setMetadataDriverImpl($driver);
$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata();
// Little hack to have default values for your entities...
foreach ($metadata as $k => $t)
{
foreach ($t->getFieldNames() as $fieldName)
{
$correctFieldName = \Doctrine\Common\Util\Inflector::tableize($fieldName);
$columns = $tan = $em->getConnection()->getSchemaManager()->listTableColumns($t->getTableName());
foreach ($columns as $column)
{
if ($column->getName() == $correctFieldName)
{
// We skip DateTime, because this needs to be a DateTime object.
if ($column->getType() != 'DateTime')
{
$metadata[$k]->fieldMappings[$fieldName]['default'] = $column->getDefault();
}
break;
}
}
}
}
// GENERATE PHP ENTITIES!
$entityGenerator = new \Doctrine\ORM\Tools\EntityGenerator();
$entityGenerator->setGenerateAnnotations(true);
$entityGenerator->setGenerateStubMethods(true);
$entityGenerator->setRegenerateEntityIfExists(true);
$entityGenerator->setUpdateEntityIfExists(false);
$entityGenerator->generate($metadata, __DIR__);
echo "Entities created";
我使用的解决方法是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');
}
推荐文章
- PHP中的echo和print有什么不同?
- 我如何使用Guzzle发送一个POST请求JSON?
- 如何POST JSON数据与PHP卷曲?
- 在Doctrine QueryBuilder中计算行数
- 在PHP中使用getter和setter而不是函数或简单的公共字段有什么优点?
- 非加密用途的最快哈希?
- 将变量传递到下一页
- 使用curl在PHP中获取HTTP代码
- 如何删除数组元素,然后重新索引数组?
- 如何从PHP调用JavaScript函数?
- 确定PHP中是否存在数组键的更快更好的方法是什么?
- 是否有一种使用Dapper调用存储过程的方法?
- \(反斜杠)在PHP(5.3+)中做什么?
- 匿名递归PHP函数
- SSL证书错误:无法获得本地颁发者证书