programing

원칙의 기본값

prostudy 2022. 9. 12. 10:29
반응형

원칙의 기본값

원칙 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단편(DEFAULTcause 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로 설정하는 시나리오에만 적용됩니다.

배경

지금까지의 답변은 구체적인 시나리오에 도움이 되지 않았지만 해결책을 찾았습니다.

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

  1. 필수가 아닙니다. 비워둘 수 있습니다.('필수' => false 사용)
  2. 공백인 채로 두면, 디폴트의 값이 됩니다.사용자 경험을 향상시키기 위해 입력 필드에 기본값을 설정하지 않고 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는 이 디폴트값을 덮어씁니다.Entityclass를 입력하고 입력 필드 값으로 설정합니다.입력 필드 값이 공백일 경우 이 값은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'

이 중 어느 것도 내게는 효과가 없었다.디폴트값을 설정하기 위해 직접 값을 설정하라는 문서를 교리 사이트에서 찾았습니다.

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;

이것은 내가 원하는 값을 삽입했다.

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

반응형