Значение по умолчанию в доктрине - PullRequest
312 голосов
/ 31 июля 2010

Как мне установить значение по умолчанию в Doctrine 2?

Ответы [ 15 ]

3 голосов
/ 12 сентября 2013

Если вы используете определение yaml для вашей сущности, для меня работает следующее в базе данных postgresql:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: boolean
            nullable: false
            options:
                default: false
2 голосов
/ 30 августа 2012

Добавление к блестящему ответу @romanb.

Это добавляет небольшие издержки при миграции, поскольку вы, очевидно, не можете создать поле с ненулевым ограничением и без значения по умолчанию.

// 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");

С этим ответом я призываю вас задуматься, зачем вам сначала значение по умолчанию в базе данных?И обычно это позволяет создавать объекты с ненулевым ограничением.

1 голос
/ 09 января 2016

Хотя установка значения в конструкторе будет работать, использование событий жизненного цикла Doctrine может быть лучшим решением.

Используя prePersist Lifecycle Event, вы можете установить значение по умолчанию для вашей сущности только при первоначальном сохранении.

1 голос
/ 13 июля 2013

Я боролся с той же проблемой.Я хотел получить значение по умолчанию из базы данных в сущности (автоматически).Угадай что, я сделал это:)

<?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";
0 голосов
/ 11 октября 2017

Будьте внимательны при установке значений по умолчанию при определении свойства!Вместо этого сделайте это в конструкторе, чтобы сохранить его без проблем.Если вы определите его в определении свойства, затем сохраните объект в базе данных, затем выполните частичную загрузку, тогда незагруженные свойства снова будут иметь значение по умолчанию.Это опасно, если вы хотите сохранить объект снова.

...