Bagaimana saya mengatur nilai default dalam Ajaran 2?
<?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
.
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).
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.
Tidak ada jawaban sebelumnya membantu saya dengan skenario tertentu tapi saya menemukan solusi.
Aku punya bentuk bidang yang dibutuhkan untuk berperilaku sebagai berikut:
Saya kemudian mencoba semua rekomendasi yang diberikan di sini. Biarkan aku daftar mereka:
<?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 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
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.
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).
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');
}
Anda dapat melakukannya dengan menggunakan xml dan juga:
<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>
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'
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.
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
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.
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";
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.
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.