Doctrine 2에서 기본값을 어떻게 설정합니까?
답변
데이터베이스 기본값은 “이식 적으로”지원되지 않습니다. 데이터베이스 기본값을 사용하는 유일한 방법 은 필드가 맵핑되는 열에 대한 스 니펫 ( 원인 포함)을 columnDefinition
지정하는 맵핑 속성을 사용하는 것입니다.SQL
DEFAULT
당신이 사용할 수있는:
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
PHP 레벨 기본값은 새로 작성되고 지속되는 오브젝트에서도 올바르게 사용할 수 있으므로 선호됩니다 (기본 값을 얻기 위해 새 오브젝트를 지속 한 후 교리는 데이터베이스로 돌아 가지 않습니다).
답변
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
*/
private $myColumn;
...
}
참고이 SQL 사용하는 DEFAULT
몇 가지와 같은 분야에 대해 지원되지 않습니다, BLOB
및 TEXT
.
답변
엔터티에 생성자를 설정하고 기본값을 설정하십시오.
답변
사용하다:
options={"default":"foo bar"}
그리고 아닙니다 :
options={"default"="foo bar"}
예를 들어 :
/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
답변
최신 정보
Symfony에 대한 문서 를 읽는 또 다른 이유 는 결코 추세에서 벗어나지 않을 것입니다. 내 경우에 대한 간단한 해결책이 있으며 field type
옵션 empty_data
을 기본값 으로 설정하는 것 입니다.
이 솔루션은 양식의 빈 입력이 DB 필드를 null로 설정하는 시나리오에만 해당됩니다.
배경
이전 답변 중 어느 것도 내 특정 시나리오에 도움이되지 않았지만 해결책을 찾았습니다.
다음과 같이 동작 해야하는 양식 필드가 있습니다.
- 필요하지 않습니다. 비워 둘 수 있습니다. ( ‘필수’=> false 사용)
- 비워두면 기본적으로 주어진 값으로 설정되어야합니다. 더 나은 사용자 경험을 위해 입력 필드에 기본값을 설정하지 않았지만 html 속성 ‘placeholder’는 덜 눈에 띄지 않기 때문에 사용했습니다.
그런 다음 여기에 제공된 모든 권장 사항을 시도했습니다. 그것들을 나열하겠습니다 :
- 엔티티 속성에 대한 기본값을 설정하십시오.
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
- 옵션 주석을 사용하십시오.
@ORM\Column(name="foo", options={"default":"foo bar"})
- 생성자에서 기본값을 설정하십시오.
/**
* @Entity
*/
class myEntity {
...
public function __construct()
{
$this->myColumn = 'myDefaultValue';
}
...
}
Symfony가 Entity 클래스를 사용하는 방식 때문에 모든 것이 효과가 없었습니다.
중대한
Symfony 양식 필드는 Entity 클래스에 설정된 기본값을 대체합니다.
즉, DB 스키마에 기본값이 정의되어있을 수 있지만 양식을 제출할 때 필요하지 않은 필드를 비워두면 메서드 form->handleRequest()
내부 form->isValid()
에서 Entity
클래스의 해당 기본값을 재정 의하여 입력 필드 값으로 설정합니다. 입력 필드 값이 비어 있으면 Entity
속성 이로 설정 됩니다 null
.
http://symfony.com/doc/current/book/forms.html#handling-form-submissions
내 해결 방법
메소드 form->handleRequest()
내부에서 컨트롤러의 기본값을 설정하십시오 form->isValid()
.
...
if ($myEntity->getMyColumn() === null) {
$myEntity->setMyColumn('myDefaultValue');
}
...
아름다운 해결책은 아니지만 작동합니다. 아마 만들 수는 validation group
있지만이 문제를 데이터 유효성 검사가 아닌 데이터 변환 으로 보는 사람들이있을 수 있습니다 .
재정의 세터 (작동하지 않음)
나는 또한 Entity
이런 식으로 세터 를 무시하려고 시도했다 .
...
/**
* Set myColumn
*
* @param string $myColumn
*
* @return myEntity
*/
public function setMyColumn($myColumn)
{
$this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;
return $this;
}
...
깨끗해 보이지만 작동하지 않습니다 . 사악한 form->handleRequest()
방법이 모델의 세터 방법을 사용하여 데이터를 업데이트하지 않기 때문 form->setData()
입니다 (자세한 내용은 자세히 알아보십시오).
답변
내가 사용한 해결 방법은 LifeCycleCallback
입니다. 예를 들어, 더 이상 “기본”메소드가 있는지 확인하기 위해 여전히 대기 중 @Column(type="string", default="hello default value")
입니다.
/**
* @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');
}
답변
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>