원칙의 기본값
원칙 2에서 기본값을 설정하려면 어떻게 해야 합니까?
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
*/
private $myColumn;
...
}
이것은 SQL을 사용합니다.DEFAULT
다음과 같은 일부 필드에서는 지원되지 않습니다.BLOB
그리고.TEXT
.
데이터베이스 기본값은 "portable"로 지원되지 않습니다.데이터베이스 기본값을 사용하는 유일한 방법은columnDefinition
매핑 애트리뷰트를 지정하다SQL
단편(DEFAULT
cause include)를 입력합니다.
다음을 사용할 수 있습니다.
<?php
/**
* @Entity
*/
class myEntity {
/**
* @var string
*
* @Column(name="myColumn", type="string", length="50")
*/
private $myColumn = 'myDefaultValue';
...
}
PHP 레벨의 디폴트치는, 새롭게 작성되어 유지되고 있는 오브젝트에서도 적절히 사용할 수 있기 때문에 선호됩니다(Doctrine은 디폴트치를 취득하기 위해서 새로운 오브젝트를 유지한 후 데이터베이스로 돌아가지 않습니다).
엔티티에 생성자를 설정하고 기본값을 설정합니다.
용도:
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 속성 '플레이스 홀더'를 사용했습니다.
그리고 나서 나는 여기에 있는 모든 추천을 시도해 보았다.목록을 작성하겠습니다.
- 엔티티 속성의 경우 기본값을 설정합니다.
<?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';
}
...
}
None of it worked and all because of how Symfony uses your Entity class.
중요한
Symfony 양식 필드는 Entity 클래스에 설정된 기본값을 재정의합니다.즉, DB의 스키마는 기본값을 정의할 수 있지만 폼을 제출할 때 필수 필드가 아닌 필드를 비워두면form->handleRequest()
내면에form->isValid()
method는 이 디폴트값을 덮어씁니다.Entity
class를 입력하고 입력 필드 값으로 설정합니다.입력 필드 값이 공백일 경우 이 값은Entity
의 재산.null
.
http://symfony.com/doc/current/book/forms.html#handling-form-submissions
마이 어프로젝트
을 설정해 .form->handleRequest()
면 insideform->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>
다음은 속성을 사용하여 PHP 8에서 수행하는 방법입니다.
#[ORM\Column(type: 'boolean', nullable: false, options: ['default' => 0])]
#[Assert\NotNull()]
private bool $isFavorite = false;
제가 스스로 해결한 방법은 이렇습니다.다음은 MySQL의 기본값을 사용하는 엔티티의 예입니다.그러나 이렇게 하려면 엔티티에 컨스트럭터를 설정해야 하며 기본값을 설정해야 합니다.
Entity\Example:
type: entity
table: example
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
label:
type: string
columnDefinition: varchar(255) NOT NULL DEFAULT 'default_value' COMMENT 'This is column comment'
이 중 어느 것도 내게는 효과가 없었다.디폴트값을 설정하기 위해 직접 값을 설정하라는 문서를 교리 사이트에서 찾았습니다.
private $default = 0;
이것은 내가 원하는 값을 삽입했다.
mysql 데이터베이스에서도 사용할 수 있습니다.
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: integer
nullable: true
options:
default: 1
@romanb의 훌륭한 답변에 더해집니다.
null 제약조건이 아닌 기본값 없이 필드를 작성할 수 없기 때문에 마이그레이션 시 약간의 오버헤드가 발생합니다.
// 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");
이 답변을 통해 애초에 데이터베이스에 기본값이 필요한 이유를 생각해 보시기 바랍니다.그리고 보통 null 제약 없이 개체를 만들 수 있습니다.
엔티티에 yaml 정의를 사용하는 경우 postgresql 데이터베이스에서 다음 기능이 작동합니다.
Entity\Entity_name:
type: entity
table: table_name
fields:
field_name:
type: boolean
nullable: false
options:
default: false
컨스트럭터에서 값을 설정하는 것은 가능하지만, 원칙 라이프 사이클 이벤트를 사용하는 것이 더 나은 해결책이 될 수 있습니다.
「 」를 .prePersist
라이프 사이클 이벤트
나는 같은 문제로 고생했다.데이터베이스에서 엔티티로 디폴트값(자동)을 설정하려고 했습니다.그거 알아? 내가 했어:)
<?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";
속성 정의에 기본값을 설정할 때는 주의하십시오.문제가 없도록 하려면 대신 컨스트럭터에서 수행하십시오.속성 정의에서 정의한 후 객체를 데이터베이스에 유지한 후 부분적으로 로드하면 로드되지 않은 속성은 다시 기본값을 가집니다.오브젝트를 다시 유지하려면 위험합니다.
언급URL : https://stackoverflow.com/questions/3376881/default-value-in-doctrine
'programing' 카테고리의 다른 글
_(언더스코어)는 예약된 키워드입니다. (0) | 2022.09.12 |
---|---|
int num = Integer.get이 되는 이유정수("123") 던지기 Null Pointer예외? (0) | 2022.09.12 |
mysql에서 그룹 이름 전 날짜 및 시간별로 주문 (0) | 2022.09.11 |
python: 변수가 배열인지 스칼라인지 식별하는 방법 (0) | 2022.09.11 |
파일에서 특정 행(행 번호별)을 읽는 방법 (0) | 2022.09.11 |