Nilai Default dalam Ajaran

Bagaimana saya mengatur nilai default dalam Ajaran 2?

Mengomentari pertanyaan (4)
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @ORM\Column(name="myColumn", type="integer", options={"default" : 0})
     */
    private $myColumn;
    ...
}

Catatan bahwa ini menggunakan SQL DEFAULT, yang tidak didukung untuk beberapa bidang seperti GUMPALAN dan TEKS.

Komentar (11)
Larutan

Database nilai default tidak "portable" yang didukung. Satu-satunya cara untuk menggunakan database nilai default adalah melalui columnDefinition pemetaan atribut mana anda menentukan SQL snippet (DEFAULT menyebabkan inklusif) untuk kolom bidang yang dipetakan ke.

Anda dapat menggunakan:

<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}

PHP-tingkat nilai-nilai default yang disukai seperti ini juga benar tersedia di baru dibuat dan bertahan benda (Doktrin tidak akan kembali ke database setelah bertahan objek baru untuk mendapatkan nilai default).

Komentar (10)

Set up konstruktor di badan anda dan set nilai default yang ada.

Komentar (6)

Gunakan:

options={"default":"foo bar"}

dan tidak:

options={"default"="foo bar"}

Misalnya:

/**
* @ORM\Column(name="foo", type="smallint", options={"default":0})
*/
private $foo
Komentar (1)

Update

Satu lagi alasan mengapa baca dokumentasi untuk Symfony akan pernah keluar dari tren. Ada solusi sederhana untuk kasus tertentu dan untuk mengatur tipe field pilihan empty_data ke nilai default.

Sekali lagi, solusi ini hanya untuk skenario mana yang kosong input dalam bentuk set DB lapangan ke null.

Latar belakang

Tidak ada jawaban sebelumnya membantu saya dengan skenario tertentu tapi saya menemukan solusi.

Aku punya bentuk bidang yang dibutuhkan untuk berperilaku sebagai berikut:

  1. Tidak diperlukan, bisa dibiarkan kosong. (Digunakan 'diperlukan' => false)
  2. Jika dibiarkan kosong, itu harus default untuk nilai yang diberikan. Untuk pengalaman pengguna yang lebih baik, saya tidak mengatur nilai default pada field input melainkan digunakan atribut html 'tempat' sejak itu kurang menonjol.

Saya kemudian mencoba semua rekomendasi yang diberikan di sini. Biarkan aku daftar mereka:

  • Mengatur nilai default ketika untuk entitas properti:
<?php
/**
 * @Entity
 */
class myEntity {
    /**
     * @var string
     *
     * @Column(name="myColumn", type="string", length="50")
     */
    private $myColumn = 'myDefaultValue';
    ...
}
  • Gunakan opsi anotasi:
@ORM\Column(name="foo", options={"default":"foo bar"})
  • Set nilai default pada constructor:
/**
 * @Entity
 */
class myEntity {
    ...
    public function __construct()
    {
        $this->myColumn = 'myDefaultValue';
    }
    ...
}

Ada yang berhasil dan semua karena bagaimana Symfony menggunakan Entity class.

PENTING

Symfony bentuk bidang mengesampingkan nilai-nilai default diatur pada Entitas kelas. Artinya, skema anda untuk DB dapat memiliki nilai default yang didefinisikan tetapi jika anda meninggalkan non-required field kosong ketika anda mengirimkan formulir, bentuk->handleRequest() dalam bentuk->isValid() metode yang akan menimpa mereka nilai default pada Entitas kelas dan mengatur mereka ke field input nilai. Jika input nilai field yang kosong, maka akan menetapkan Entitas properti null.

http://symfony.com/doc/current/book/forms.html#handling-form-submissions

Saya Solusi

Set nilai default pada controller anda setelah bentuk->handleRequest() dalam bentuk->isValid() metode:

...
if ($myEntity->getMyColumn() === null) {
    $myEntity->setMyColumn('myDefaultValue');
}
...

Bukan solusi yang indah tapi itu bekerja. Aku mungkin bisa membuat validasi kelompok tapi mungkin ada orang yang melihat masalah ini sebagai transformasi data bukan validasi data, saya serahkan pada anda untuk memutuskan.


Menimpa Setter (Tidak Bekerja)

Saya juga mencoba untuk mengesampingkan Entitas setter cara ini:

...
/**
 * Set myColumn
 *
 * @param string $myColumn
 *
 * @return myEntity
 */
public function setMyColumn($myColumn)
{
    $this->myColumn = ($myColumn === null || $myColumn === '') ? 'myDefaultValue' : $myColumn;

    return $this;
}
...

Ini, meskipun tampak bersih, itu doesn't bekerja. Alasannya adalah bahwa kejahatan bentuk->handleRequest() metode ini tidak menggunakan Model's penyetel untuk update data (menggali ke dalam bentuk->setData() untuk rincian lebih lanjut).

Komentar (5)

Solusi yang saya gunakan adalah LifeCycleCallback. Masih menunggu untuk melihat jika ada lebih "asli" metode, misalnya @Kolom(type="string", default="hello nilai default").

/**
 * @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');
}
Komentar (2)

Anda dapat melakukannya dengan menggunakan xml dan juga:



        Your SQL field comment goes here.
        Default Value

Komentar (0)

Berikut adalah bagaimana saya soal itu untuk diriku sendiri. Di bawah ini adalah contoh Entitas dengan nilai default pada MySQL. Namun, ini juga memerlukan setup konstruktor di badan anda, dan bagi anda untuk mengatur nilai default yang ada.

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'
Komentar (3)

Bekerja untuk saya pada database mysql juga:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: integer
            nullable: true
            options:
                default: 1
Komentar (1)

Tak satu pun dari ini bekerja untuk saya. Saya menemukan beberapa dokumentasi pada ajaran's situs yang mengatakan bahwa untuk menetapkan nilai secara langsung untuk mengatur nilai default.

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/faq.html

private $default = 0;

Ini dimasukkan nilai yang saya inginkan.

Komentar (4)

Jika anda menggunakan yaml definisi untuk entitas, berikut ini bekerja untuk saya pada database postgresql:

Entity\Entity_name:
    type: entity
    table: table_name
    fields: 
        field_name:
            type: boolean
            nullable: false
            options:
                default: false
Komentar (1)

Menambahkan @romanb brilian menjawab.

Hal ini menambah sedikit biaya overhead dalam migrasi, karena anda jelas tidak bisa menciptakan lapangan dengan not null constraint dan dengan tidak ada nilai default.

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

Dengan jawaban ini, saya mendorong anda untuk berpikir mengapa anda perlu nilai default di dalam database di tempat pertama? Dan biasanya itu adalah untuk memungkinkan menciptakan benda-benda dengan not null constraint.

Komentar (1)

Aku berjuang dengan masalah yang sama. Saya ingin memiliki default value dari database ke dalam badan (secara otomatis). Coba tebak, aku melakukannya :)

<?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";
Komentar (2)

Sementara pengaturan nilai dalam konstruktor akan bekerja, menggunakan Doktrin Siklus peristiwa-peristiwa yang mungkin menjadi solusi yang lebih baik.

Dengan memanfaatkan prePersist Siklus hidup Acara, anda bisa mengatur nilai default pada entitas hanya pada awal bertahan.

Komentar (1)

Berhati-hati ketika menetapkan nilai-nilai default pada definisi properti! Melakukannya di konstruktor sebaliknya, untuk tetap bebas masalah. Jika anda menentukan pada definisi properti, kemudian bertahan objek ke database, kemudian membuat beban parsial, maka tidak dimuat properties akan lagi memiliki nilai default. Yang lebih berbahaya jika anda ingin bertahan objek lagi.

Komentar (0)