[php] 교리의 기본값

Doctrine 2에서 기본값을 어떻게 설정합니까?



답변

데이터베이스 기본값은 “이식 적으로”지원되지 않습니다. 데이터베이스 기본값을 사용하는 유일한 방법 은 필드가 맵핑되는 열에 대한 스 니펫 ( 원인 포함)을 columnDefinition지정하는 맵핑 속성을 사용하는 것입니다.SQLDEFAULT

당신이 사용할 수있는:

<?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몇 가지와 같은 분야에 대해 지원되지 않습니다, BLOBTEXT.


답변

엔터티에 생성자를 설정하고 기본값을 설정하십시오.


답변

사용하다:

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로 설정하는 시나리오에만 해당됩니다.

배경

이전 답변 중 어느 것도 내 특정 시나리오에 도움이되지 않았지만 해결책을 찾았습니다.

다음과 같이 동작 해야하는 양식 필드가 있습니다.

  1. 필요하지 않습니다. 비워 둘 수 있습니다. ( ‘필수’=> false 사용)
  2. 비워두면 기본적으로 주어진 값으로 설정되어야합니다. 더 나은 사용자 경험을 위해 입력 필드에 기본값을 설정하지 않았지만 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>